2017-10-06 59 views
0

我在SpringBoot中的RestController上編寫集成測試。 通常我會用SpringRunner.class運行,但是當涉及到模擬靜態方法時,我需要使用PowerMock。春季啓動嘲笑集成測試中PowerMock的靜態方法

奇怪的事實是,當我運行一個測試,它們分別通過(但返回錯誤消息),當我嘗試運行整個測試類,沒有測試通過並返回相同的錯誤消息。

@RunWith(PowerMockRunner.class) 
@PrepareForTest({JwtUtils.class}) 
//@PowerMockRunnerDelegate(SpringRunner.class) THIS DOESN'T WORK!!! 
@SpringBootTest(classes = SpringBootJwtApplication.class) 
public class RestAccessIntegrationTest { 

    @Autowired @InjectMocks 
    RestController restController; 

    @Mock 
    HttpServletRequest request; 

    @Test 
    public void operationsPerAccountWhenSuccessfulTest(){ 
    mockStatic(JwtUtils.class); 
    when(JwtUtils.myMethod(request)).thenReturn("blabla"); 
    String expected = ... ; 
    String actual = restController.getOperations(); 
    assertEquals(actual, expected); 
    } 

} 

如果運行測試或整個班級我得到這個類型的錯誤:

異常線程「main」 java.lang.NoSuchMethodError:org.powermock.core.MockRepository.addAfterMethodRunner( Ljava /朗/ Runnable接口;)在org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:50)

如果我取消@PowerMockRunnerDelegate(SpringRunner.class)有說到這個其他錯誤:

線程「主」java.l中的異常ang.NoClassDefFoundError:組織/ powermock /核心/ testlisteners/GlobalNotificationBuildSupport $回調 在org.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner.run(DelegatingPowerMockRunner.java:139)

回答

0

這是由於PowerMock和Mockito的庫版本不兼容。我建議檢查PowerMock團隊提供的兼容版本表,或者切換到JMockit來模擬靜態和私有方法。

1

when方法,嘗試使用any(HttpServletRequest.class)而不是request模擬對象。也可以用MockHttpServletRequest代替嘲笑HttpServletRequest。這應該工作,

@RunWith(PowerMockRunner.class) 
@PrepareForTest(JwtUtils.class) 
@PowerMockIgnore({"javax.management.*"}) 
public class RestAccessIntegrationTest { 

    @InjectMocks 
    private RestController restController; 

    private MockHttpServletRequest request; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     request = new MockHttpServletRequest(); 
     RequestContextHolder.setRequestAttributes(
       new ServletRequestAttributes(request)); 
    } 

    @Test 
    public void operationsPerAccountWhenSuccessfulTest() { 
     mockStatic(JwtUtils.class); 
     when(JwtUtils.myMethod(any(HttpServletRequest.class))) 
      .thenReturn("blabla"); 

     String expected = ... ; 
     // does your getOperations take HttpServletRequest 
     // as parameter, then controller.getOperations(request); 
     String actual = restController.getOperations(); 
     assertEquals(actual, expected); 
    } 
} 
+0

謝謝你,但它仍然給 –

+0

你還在使用'@SpringBootTest(類= SpringBootJwtApplication.class)'同樣的錯誤?當我不使用它時,我沒有得到任何異常。 –

+0

我試過了,沒有...我已經使用了你給我的所有指示。奇怪的是每個單獨的測試都有效,而整個課程都不是。 –