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.
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