2017-12-28 15 views
0

Ich arbeite an einer Spring-fähigen Embedded Tomcat-Anwendung mit Annotation-basierter Konfiguration. Die Anwendung verwendet Spring MVC Controller für ihre REST-Endpunkte. Zur Trennung von Problemen und zur Vermeidung doppelter Beans in separaten Kontexten enthält der übergeordnete Kontext alle Beans, die keine REST-Endpunkte sind, und der Spring Web MVC-Kontext enthält alle Beans, bei denen es sich um REST-Endpunkte handelt.Wie wird die Federhierarchie bei Unit/Integration-Tests verwaltet?

Ich möchte neue Integrationstests für diese Endpunkte schreiben und umgestalten, die für die Struktur der App repräsentativ sind. Es gibt bestehende Testklassen wie folgt:

import com.stuff.web.MyEndpoint; 

@Configuration 
@ComponentScan(basePackages = {"com.stuff"}) 
public class SpringConfig { ... } 

@WebAppConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {SpringConfig.class}) 
public class TestMyEndpoint { 

    @Autowired 
    private MyEndpoint myEndpoint; 

    private MockMvc mockMvc; 

    @Before 
    public void setUp() { 
     mockMvc = MockMvcBuilders 
       .standaloneSetup(myEndpoint) 
       .build(); 
    } 

    @Test 
    public void testMyEndpoint() throws Exception { 
     mockMvc.perform(get("/myendpoint") 
         .accept(MediaType.APPLICATION_JSON_VALUE)) 
         .andExpect(status().isOk()) 
         .andReturn(); 
    } 
} 

Das Problem ist, dass der Kontext, dass ich für diesen Test bin jetzt mit jeder Bohne hat geladen, während ich möchte sicherstellen, dass es keine nicht-REST Bohnen geladen, dass während der Ausführung der Tests in RestController-Beans aufrufen.

Hinzufügen von so etwas wie

@Configuration 
@ComponentScan(basePackages = {"com.stuff"}, 
       excludeFilters = { 
        @Filter(type = FilterType.REGEX, pattern = "com.stuff.web.*")}) 
public class SpringConfig { ... } 

Würde die Art der Trennung sicherzustellen, dass ich für gehe, aber dann habe ich keinen Zugriff auf die com.stuff.web.MyEndpoint Klasse, die ich versuche zu Prüfung.

Fehle ich etwas einfach? Lassen Sie es mich wissen, wenn ich die Situation klar erkläre.

Antwort

0

Die Art der Trennung, die Sie beschreiben (mvc vs non-mvc) ergab vor 10 Jahren Sinn, nicht mehr. Trennen Sie Ihren Code nach Funktionalität/Entwurfsmustern (Web/Service/Repository usw.) und weisen Sie für diesen Layer spezifische Klassen @Configuration auf. Die Spring stereotype annotations sind gut genug, um einen Hinweis darauf zu geben, wie deine App aufgeteilt werden sollte. Dann legen Sie Ihre Tests in das gleiche Paket wie Ihr Zielcode und überspielen alle Abhängigkeiten.

Es scheint nicht, dass Sie Spring Boot verwenden (Sie sollten wirklich), aber sie haben einen großen Abschnitt in den Dokumenten zum Testen "Scheiben" Ihrer Anwendung. https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-tests

Verwandte Themen