2017-10-06 3 views
0

J'écris un test d'intégration sur un RestController dans SpringBoot. Normalement, je voudrais courir avec SpringRunner.class, mais quand il s'agit de Mock une méthode statique, j'ai besoin d'utiliser PowerMock. Le fait étrange est que lorsque j'exécute les tests individuels, ils passent individuellement (mais renvoient des messages d'erreur), quand j'essaie d'exécuter toute la classe de test, aucun test ne passe et il renvoie le même message d'erreur.Démarrage de méthodes statiques de démarrage avec PowerMock dans le test d'intégration

@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); 
    } 

} 

Si je lance le test ou toute la classe je reçois une erreur de ce type:

Exception dans le thread "principal" java.lang.NoSuchMethodError: org.powermock.core.MockRepository.addAfterMethodRunner (Ljava/lang/Runnable;) à org.powermock.api.mockito.internal.mockcreation.MockCreator.mock (MockCreator.java:50)

Si je décommenter @PowerMockRunnerDelegate (SpringRunner.class) là, il vient cette autre erreur :

Exception dans le fil "principal" java.l ang.NoClassDefFoundError: org/powermock/core/testlisteners/GlobalNotificationBuildSupport $ Callback à org.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner.run (DelegatingPowerMockRunner.java:139)

Répondre

0

Il était dû à l'incompatibilité dans la version de bibliothèque de PowerMock et Mockito. Je suggère de vérifier la table de version de compatibilité fournie par l'équipe PowerMock ou de passer à JMockit pour se moquer des méthodes statiques et privées.

1

Dans la méthode when, essayez d'utiliser any(HttpServletRequest.class) au lieu de l'objet request. Utilisez également MockHttpServletRequest au lieu de se moquer de HttpServletRequest. Cela devrait fonctionner,

@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

Merci, mais il donne toujours la même erreur –

+0

Utilisez-vous encore '@SpringBootTest (classes = SpringBootJwtApplication.class)'? Je n'ai pas eu d'exception quand je ne l'utilise pas. –

+0

J'ai essayé avec et sans ... J'ai utilisé toutes les instructions que vous m'avez données. La chose étrange est que chaque test fonctionne, la classe entière non. –