2012-10-19 4 views
0

J'essaie de créer un test pour mon contrôleur. Voici ce que j'ai similaire. Juste des changements de nom. J'utilise Mockito et Spring MVC. Les fichiers de configuration de test ont les beans autowired dans les moqueurs par l'intermédiaire de la fausse usine. Je reçois un pointeur NULL ...Que fais-je pour me tromper?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={ 
     ... 
}) 
public class MyReportControllerTest { 

private MockHttpServletRequest request; 
private MockHttpServletResponse response; 
private MockHttpSession session; 
private HandlerAdapter handlerAdapter; 

@Autowired 
private ApplicationContext applicationContext; 

@Autowired 
private MyService myService; 

@Autowired 
private RequestMappingHandlerMapping rmhm; 

@Before 
public void setUp() throws Exception { 
    request = new MockHttpServletRequest(); 
    response = new MockHttpServletResponse(); 
    session = new MockHttpSession(); 
    handlerAdapter = applicationContext 
      .getBean(RequestMappingHandlerAdapter.class); 

    request.setSession(session); 
    request.addHeader("authToken", "aa"); 

    Mockito.when(
      myService.getMyInfo(YEAR)) 
      .thenReturn(getMyInfoList()); 
} 
@Test 
public void testGetMyInfo(){ 
    request.setRequestURI("/getMyInfo/" + 2011); 
    request.setMethod("GET"); 

    try { 
     if(handlerAdapter == null){ 
      System.out.println("Handler Adapter is null!"); 
     } 
     if(request == null){ 
      System.out.println("Request is null!"); 
     } 
     if(response == null){ 
      System.out.println("Response is null!"); 
     } 
     if(rmhm.getHandler(request) == null){ 
      System.out.println("rmhm.getHandler(request) is null!"); 
     } 
     //the above returns null 
     System.out.println("RMHM: " + rmhm.toString()); 
     System.out.println("RMHM Default Handler: " + rmhm.getDefaultHandler()); 
     handlerAdapter.handle(request, response, 
       rmhm.getHandler(request) 
       .getHandler());//null pointer exception here <--- 

     ... 


    } catch (Exception e) { 
     e.printStackTrace(); 
     fail("getMyReport failed. Exception"); 
    } 

} 

public List<MyInfo> getMyInfoList(){...} 

Je l'ai fait une mise au point approfondie et a constaté que le gestionnaire reste nulle pour ma demande maquette. Qu'est-ce qui me manque pour ne pas être transformé en gestionnaire, ou même aller au gestionnaire par défaut?

Répondre

0

Vous avez un certain nombre de problèmes ici.

Tout d'abord, essayez-vous à unité test de votre contrôleur ou intégration tester? Cela ressemble certainement plus à un test d'intégration; vous avez les annotations du printemps @Autowired et un @ContextConfiguration.

Mais si c'est le cas, pourquoi essayez-vous de définir un comportement fictif sur myService? Cela ne marchera jamais - Spring va injecter une "vraie" instance et Mockito n'a aucun espoir de travailler sa magie là-dessus.

Relatif; il vous manque tout type d'appel d'initialisation factice qui serait nécessaire si vous voulez que cela fonctionne. Enfin, pourquoi faites-vous tout ce câblage (HandlerMappings, HandlerAdapters, etc) en jugeant par le nom de votre test, tout ce que vous voulez vraiment faire est de tester votre MyReportController? Ne pouvez-vous pas simplement appeler la méthode "endpoint" nécessaire avec une demande fictive, une réponse, etc.

+0

Test d'intégration à l'origine. On m'a donné le code de base sans aucune description de l'intention du test. Je me rends compte que je ne peux pas me moquer du service, alors il faudrait que ce soit une intégration, plus tard. J'ai simplement manqué que le bean pour le contrôleur n'a pas été créé dans les fichiers de configuration de test. Tout ce que j'ai fait, c'était ajouter ça et ça a marché. – user1281598

Questions connexes