2016-04-08 10 views
0

Ich habe ein paar JUnit-Tests geschrieben, um meine REST-Funktionalität zu testen. Da ich nur REST (und nicht die Datenbank, Domänenlogik, ..) testen möchte, habe ich einen Stubfill mit Dummy-Daten erstellt, der für den Rest des Backends steht.Wie lade ich verschiedene Klassen für JUnit-Tests dynamisch?

[EDIT] Zum Beispiel möchte ich testen/Kunden/alle Eine GET-Anfrage wird mit einer Arraylist beantwortet werden, die alle Namen enthält.

Ich benutze daher MockMV.

Wenn Sie normalerweise eine GET-Anfrage an/customers/all ausführen, wird eine Anfrage an die Datenbank gesendet. Um nun meinen REST-Controller zu testen, habe ich einen Stub erstellt, der auf GET/customers/all mit einer einfachen Arraylist reagiert, die nur meinen Namen enthält (wie Sie im Test sehen können). Wenn ich diesen lokalen Test teste, ersetze ich einfach die reale Klasse durch diesen Stub. Wie wird das dynamisch gemacht?

+0

Controller wie jede andere Klasse getestet werden, mit Ausnahme der Tatsache, dass sie in der Regel stumm und würden eine große Menge an Arbeit zu anderen Klassen delegieren . Was Sie tun möchten, ist, alle anderen Klassen zu verspotten, die an der Verarbeitung und in der Beziehung zum Controller beteiligt sind. Um Ihre Frage zu beantworten, würde ich sagen, dass Ihre Herangehensweise falsch scheint. Könnten Sie bitte klarstellen, über welchen Stummel Sie sprechen? – LoreV

+0

Ich verwende MockMVC, um meinen REST zu testen. Wenn ich keinen Stub für den Rest meines Backends verwende, wird jeder Test, den ich mit MockMVC mache, eine Anfrage an den Rest meines Backends stellen, nicht wahr? – Dai

+0

MockMvc wird für Integrationstests verwendet, auch End2End-Tests genannt. Diese haben den Zweck, mehr als eine Einheit Ihres Codes zu testen. Siehe http://www.petrikainulainen.net/programming/spring-framework/integration-testing-of-spring-mvc-applications-configuration/. Nach Ihrer Frage würde ich jedoch Mockito empfehlen, Komponententests für Ihren Controller zu erstellen, bevor Sie mit dem MockMVC-Integrationsframework fortfahren. – LoreV

Antwort

2

Ich glaube nicht, Ihr Ansatz die gut ist. Verwenden Sie einfach Ihren echten Controller, aber stuppen Sie seine Abhängigkeiten (z. B. mit Mockito), genau wie bei einem herkömmlichen Komponententest.

Sobald Sie eine Instanz des Controllers mit stubbed Abhängigkeiten haben, können Sie eine Standalone-Setup verwenden und MockMvc verwenden, um zu testen, neben dem Controller-Code, den Mapping-Annotationen, die JSON Rangier usw.

Thias Ansatz ist in the documentation beschrieben.

Beispiel mit Mockito, vorausgesetzt, den Controller-Delegierten zu einem Customerservice:

public class CustomerControllerTest { 

    @Mock 
    private CustomerService mockCustomerService; 

    @InjectMocks 
    private CustomerController controller; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     MockitoAnnotations.initMocks(this); 
     this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); 
    } 

    @Test 
    public void shouldListCustomers() { 
     when(mockCustomerService.list()).thenReturn(
      Arrays.asList(new Customer("John"), 
          new Customer("Alice"))); 

     this.mockMvc.perform(get("/customers").accept("application/json")) 
      .andExpect(status().isOk()) 
      .andExpect(jsonPath("$").isNotEmpty()) 
      .andExpect(jsonPath("$[0].name", is("John"))); 
    } 
} 
+0

Ich benutze meine echten REST-Controller. Alle meine REST-Controller kommunizieren mit einer Schnittstelle. Diese Schnittstelle ist das Gateway zu meiner Domänenlogik. Da ich mehrere REST-Controller habe, wäre es viel einfacher, diese Schnittstelle irgendwie durch einen Stub zu ersetzen. Ist das was du sagst? – Dai

+0

Nun, das ist das, was das obige tut: Es ersetzt den CustomerService durch einen Stub. Aber der Stub ist nicht global für die Anwendung. Es ist spezifisch für den Test und gibt die für diesen Test erforderlichen Werte zurück. Möglicherweise sollte ein anderer Test überprüfen, ob der Controller die Liste auf 1000 Elemente kürzt, wenn der Dienst mehr als 1000 Kunden zurückgibt. Kein Problem: Schreiben Sie einfach einen anderen Test, bei dem der Dienst stubbed ist, um 10001 Kunden zurückzugeben. –

+0

Da Mockito ein mockendes Framework ist, können Stubs/Mocks dynamisch erstellt werden, ohne dass Sie eine falsche Implementierung der Schnittstelle zu Stub schreiben müssen. –

Verwandte Themen