2015-03-27 3 views
2
public class ProjectIdInitializer { 
    public static void setProjectId(String projectId) { 
     //load spring context which i want to escape in my test 
    } 
} 

public class MyService { 
    public Response create(){ 
     ... 
     ProjectIdInitializer.setProjectId("Test"); 
    } 
} 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ProjectIdInitializer.class}) 
public class MyServiceTest{ 
    @InjectMocks 
    private MyService myServiceMock ; 

    public void testCreate() { 
     PowerMockito.mockStatic(ProjectIdInitializer.class); 
     PowerMockito.doNothing().when(ProjectIdInitializer.class, "setProjectId", Mockito.any(String.class)); 
     // Does not work,still tries to load spring context 
     Response response=myServiceMock .create(); 
    } 

Как я могу убедиться, что ничего не происходит, если вызывается ProjectIdInitializer.setProjectId() из myservice?Издевательский класс, который использует статический метод void другого класса

+0

Если оказывается, чтобы быть правдой, что только PowerMock поможет вам ... рассмотреть, если есть, если ваш проект может быть изменен ** не ** использовать статическую таким образом; и поэтому избегать PowerMock. (просто потому, что PowerMock лучше всего использовать ..., избегая его). – GhostCat

ответ

4

Как указано в комментариях, вы должны знать, что многие вещи могут сломаться из-за PowerMock.

Вы должны использовать PowerMock бегун, что-то вроде этого:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ProjectIdInitializer.class) 
public class MyServiceTest{ 
    private MyService myService = new MyService(); 

    public void testCreate() 
    { 
    PowerMockito.mockStatic(ProjectIdInitializer.class); 
    PowerMockito.doNothing().when(ProjectIdInitializer.class, "setProjectId", Mockito.any(String.class)); 

    Response response=myService.create(); 
    } 
} 

смотри также this doc.


Это самодостаточный образец:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(A.ProjectIdInitializer.class) 
public class A { 
    private MyService myService = new MyService(); 

    @Test 
    public void testCreate() throws Exception { 
     PowerMockito.mockStatic(ProjectIdInitializer.class); 
     PowerMockito.doNothing().when(ProjectIdInitializer.class, "setProjectId", Mockito.any(String.class)); 

     System.out.println("Before"); 
     Response response = myService.create(); 
     System.out.println("After"); 
    } 

    public static class ProjectIdInitializer { 
     public static void setProjectId(String projectId) { 
      //load spring context which i want to escape in my test 
      System.out.println(">>>>>> Game over"); 
     } 
    } 

    public static class Response { 
    } 

    public static class MyService { 
     public Response create() { 
      // ... 
      ProjectIdInitializer.setProjectId("Test"); 
      return null; 
     } 
    } 
} 

выходов:

Before 
After 

Как и ожидалось

+0

Я аннотировал мой модульный тест с помощью PowerMockRunner. См. Edit.It не работает, хотя – WillMcavoy

+0

@RC. Подумайте о том, чтобы направить ответ на красное «предупреждение», поскольку PowerMock редко «хороший ответ» на «вопросы статического тестирования». PowerMock может разбить многие другие инструменты, например, для измерения охвата. Поэтому «необходимость использования PowerMock» часто переводится как «изменение дизайна». – GhostCat

+0

@ EddyG, хорошо. Я добавлю предупреждение –

Смежные вопросы