2017-05-22 1 views
0

Ich bin meist ein Spring Boot Benutzer, wenn es darum geht, Ruhe Apis, so dass ich nicht immer mit klassischen Spring-Projekte mit Xml-Konfiguration.Mock Rest Endpunkt ohne Instantiierung Controller Klasse

Allerdings muss ich einen Rest Endpunkt zum Testen auf dieses bestimmte Projekt verspotten. Es gibt auch einige DBUnit, um die Datenbankwerte zu überspielen. Hier ist der Code der Rest Controller ich verwende:

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

Und hier ist der (offensichtlich nicht funktioniert) Code der Testklasse I schrieb:

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

Als ich das laufen, ich erhalten einen Dispatcher Servlet Ausnahme wie folgt aus:

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 

ich weiß, dass soll ich die myRESTImpl Klasse instanziiert. Es hat jedoch keinen Konstruktor (Dies ist nicht mein Code). Ich denke, ich habe ein Verständnisproblem, wie die Abhängigkeiten in dieser Art von Frühlings-App funktionieren.

Was ist die Problemumgehung, um MockMvc in diesem Fall richtig zu verwenden?

Danke für Ihre Hilfe.

Antwort

2

auf den Anmerkungen Basierend scheint, dass MyRESTImpl JAX-RS verwendet den Endpunkt (n) (@Path, @Context, @GET) statt Spring MVC zu implementieren. Ich würde nicht erwarten, this.mockMvc = MockMvcBuilders.standaloneSetup(myRESTImpl); für nicht Spring Web-Endpunkte arbeiten, startet MockMvc nicht einen Servlet-Container.

kann ich noch ein paar Fehler sehen:

java.lang.NoClassDefFoundError: org/springframework/web/servlet/DispatcherServlet. DispatcherServlet ist nicht im Klassenpfad, am wahrscheinlichsten, weil spring-web Artefakt keine Abhängigkeit in Ihrem pom.xml enthalten ist und eine Art der Bestätigung der Endpunkte nicht unter Verwendung Spring Web implementiert werden.

private static final Logger LOGGER = LogManager.getLogger(SalarieRESTImpl.class); verwendet die falsche Klasse.

Eine semantische scheint dies eine Endpunkt-Implementierung, die auch eine @Repository (oder Dao Implementierung) ist, wo service Abhängigkeiten in injiziert werden. Das klingt seltsam, normalerweise würden Sie Dao in Services und Services in Controller oder Endpoint-Implementierungen einspeisen.

+0

Vielen Dank für die Informationen, es wird klarer für mich. Ich denke, ich werde versuchen, einen "jax rs-Weg" zu finden, um den Endpunkt zu testen und ein bisschen mehr über den Grund für das @ Repository mit meinen Kollegen zu erfahren. – matthieusb

Verwandte Themen