2017-05-22 2 views
0

Je suis surtout un utilisateur de Spring Boot quand il s'agit de faire des apis de repos, donc je ne suis pas toujours à l'aise avec les projets Spring classiques utilisant la configuration xml.Point de terminaison simulé sans classe de contrôleur instanciant

Cependant, j'ai besoin de se moquer d'un point de terminaison de repos pour tester sur ce particulier du projet. Il y a aussi DBUnit pour se moquer des valeurs de la base de données. Voici le code du contrôleur de repos J'utilise:

@Path("/endpoint") 
@Repository("myRestImpl") 
public class MyRESTImpl implements MyREST { 

    private static final Logger LOGGER = LogManager.getLogger(SalarieRESTImpl.class); 

    @Context 
    private MessageContext jaxrsContext; 

    @Resource 
    private WebServiceContext jaxwsContext; 

    @Value(value = "${base.url}") 
    private String baseUrl; 

    @Autowired 
    public SomeService someService; 

    @Autowired 
    private SomeOtherService someOtherService; 

    @Override 
    @GET 
    @Path("/test") 
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) 
    public Response getSalarieInfoByMatricule() { 
     LOGGER.info("Simple 404 test", matricule); 
     ResponseBuilder response = null; 

     esponse = Response.status(404); 

     return response.build(); 
    } 
} 

Et voici le (évidemment ne fonctionne pas) le code de la classe de test je l'ai écrit:

@ContextConfiguration(locations = { "classpath:/tu-dao-beans.xml" }) 
@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, 
     DbUnitTestExecutionListener.class }) 
@DatabaseSetup(value = { "/db_data/dao/common.xml" }) 
@DbUnitConfiguration(dataSetLoader = ReplacementDataSetLoader.class) 
public class MyMockMvcTest { 

    @Autowired 
    MyRESTImpl myRESTImpl; 

    @Autowired 
    private MappingJackson2HttpMessageConverter jacksonMessageConverter; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     MockitoAnnotations.initMocks(this); 

     this.mockMvc = MockMvcBuilders.standaloneSetup(myRESTImpl) 
    .setMessageConverters(jacksonMessageConverter).build(); 
    } 

    @Test 
    public void test() throws Exception { 
     mockMvc.perform(get("/endpoint/test")).andExpect(status().isNotFound()); 
    } 
} 

Quand je cours, je obtenir une exception de servlet Dispatcher comme ce qui suit:

java.lang.NoClassDefFoundError: org/springframework/web/servlet/DispatcherServlet 
    at org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup(MockMvcBuilders.java:75) 
    at primobox.demat.webservices.rest.salarie.SalarieRESTImplIntMockMvcTest.setup(SalarieRESTImplIntMockMvcTest.java:36) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 10 more 

Je sais que je suis censé instancier la classe myRESTImpl. Cependant il n'a pas de constructeur (Ce n'est pas mon code). Je pense que j'ai un problème de compréhension de la façon dont les dépendances fonctionnent dans ce genre d'application de printemps.

Quelle est la solution de contournement pour utiliser correctement MockMvc dans ce cas?

Merci pour votre aide.

Répondre

2

Sur la base des annotations, semble que MyRESTImpl utilise JAX-RS pour mettre en œuvre le point final (s) (@Path, @Context, @GET) au lieu de Spring MVC. Je ne m'attendrais pas this.mockMvc = MockMvcBuilders.standaloneSetup(myRESTImpl); à fonctionner pour les points de terminaison Web non Spring, MockMvc ne démarre pas un conteneur de servlet.

je peux voir quelques erreurs:

java.lang.NoClassDefFoundError: org/springframework/web/servlet/DispatcherServlet. DispatcherServlet n'est pas dans le classpath, très probablement parce que spring-web artefact n'est pas une dépendance incluse dans votre pom.xml et une sorte de confirmation que les points de terminaison ne sont pas implémentés en utilisant Spring Web.

private static final Logger LOGGER = LogManager.getLogger(SalarieRESTImpl.class); utilise la mauvaise classe.

Sémantiquement, cela semble être une implémentation de noeud final qui est également une implémentation @Repository (ou Dao) dans laquelle des dépendances service sont injectées. Cela semble étrange, vous auriez normalement injecter Dao dans les services et les services dans les contrôleurs ou les implémentations Endpoint.

+0

Merci beaucoup pour l'info, ça devient plus clair pour moi. Je pense que je vais essayer de trouver un moyen de tester le point de terminaison et d'en savoir un peu plus sur la raison de l'utilisation de @Repository par mes collègues. – matthieusb