2016-08-01 13 views
0

wir entwickeln eine anwendung mit feder mvc framework. Ich habe alle unten aufgeführten Klassen gegeben, bitte schlagen Sie vor, wie Sie einen Junit-Testfall für das folgende Szenario schreiben.junit testfall für frühling MVC

Ich möchte einen Junit-Testfall für die validateAccountInformation (requestDTO) -Methode schreiben, die in der validateAccount (..) -Methode der LPAValidator.java-Klasse aufgerufen wird. Unten ist mein Junit-Test gefolgt von den Java-Klassen. Der tatsächliche Anruf wird vom LPAController.java wie im folgenden Code angezeigt.

LPAControllerTest.java

 @Test(groups = "manual") 
     public void submitRequestForLPAAccountTest() 
     { 
     // businessCalendar.nextBusinessDay(
     //    LocalDateHelper.today(), LPAConstants.TWENTY_BUSSINESS_DAYS) 
    //i want to write the test case for the above commented logic, 
    //if business days is not equal to twenty days, test should fail. 
     } 

LPAController.java

@RequestMapping(value = "/lpa/{accNumber}/spread, method = RequestMethod.GET) 
    public @ResponseBody LPAResponseDTO accountSearch(@RequestBody final LPARequestDTO clientrequestBody, 
             @PathVariable final String accNumber, final HttpServletResponse response) 
    { 
     //some logic goes here 

final LPAAccountResponse domainResponse = service.submitRequestForLPAAccount(requestBody); 

    } 

LPAServiceImpl.java

LPARepository.java

@PermitAll 
    @NonTransactional 
    public LPAResponse submitRequestForLPAAccount(final LPARequest requestDTO) 
    { 
    //some logic 
    lpaValidator.validateAccount(requestDTO); 

    //some logic 

    } 

LPAValidator.java - Java-Klasse für Validierungen

@component 
class LPAValidator{ 
    @Inject 
    private BusinessCalendar businessCalendar; 

      void validateAccount(final LPARequest requestDTO) throws Exception { 
      try { 
       validateAccountInformation(requestDTO); 
       } catch(Exception e){ 
       } 
     } 

      private void validateAccountInformation(final LPARequest requestDTO) throws Exception{ 
       final accDate lpaAccDate = requestDTO.getLPADate(); 
       final LocalDate twentyBussinessDays = businessCalendar.nextBusinessDay(
        LocalDateHelper.today(), LPAConstants.TWENTY_BUSSINESS_DAYS); //i want to write 
    //test case for this line of code, if business days given is more than twenty test should fail. 
       //some logic here 
     } 

Bitte legen nahe, was in LPAControllerTest.java hinzugefügt werden muss die nextBusinessDay (..) zu testen, wie oben erörtert.

+0

Obwohl Diskussionen gibt es, ich denke, es ist häufiger LPAController als LpaController zu schreiben, nur neue Wörter zu kapitalisieren, und nicht Abkürzungen (obwohl sie sind). Natürlich haben Sie HTTPServlet (oder HttpServlet), die es irgendwie bricht, aber ... –

Antwort

2

Sie versuchen, einen Integrationstest zu schreiben, in dem Ihr Controller aufgerufen wird, der dann alle Unterklassen aufruft, bis der Validator ausgelöst wird. Das ist kein traditioneller Unit-Test.

Ein traditioneller Komponententest würde nur den Validator geradeaus testen, und nichts mehr.

Dennoch, wenn ein Integrationstest schreiben, spring documentation to the rescue
Kurz gesagt, es wird Sie benötigen einen Application mit allen notwendigen Gerüst zu erstellen und dann einen Anruf mockMvc verwenden, um eine GET auf die erstellte Anwendung zu tun.

Wenn Sie den Validator testen möchten, verwenden Sie einfach Mockframework: See [http://mockito.org] gibt Ihnen etwas wie folgt aus:

@Mock BusinessCalendar businessCalendarMock; 
@Mock LPARequest mockRequest; 
@Mock accDate mockDate; 
@Mock LocalDate mockLocalDate; 
@InjectMocks LPAValidator lpaValidator = new LPAValidator(); 
@Test public void testValidateAccount() { 
    when(mockRequest.getLPAdate()).thenReturn(mockDate); 
    when(businessCalendar.nextBusinessDay(LocalDateHelper.today(),LPAConstants.TWENTY_BUSSINESS_DAYS).thenReturn(mockLocalDate); 
    // continue your test from here 
    lpaValidator.validateAccount(mockRequest); 
    verify(businessCalendar).nextBusinessDay(LocalDateHelper.today(),LPAConstants.TWENTY_BUSSINESS_DAYS); 
    // although if the use of mockLocalDate is integral to your code, it'll probably show before and no verify is necessary; 
+0

Da ich neu im Frühling bin, verwirrt mich die Verbindung, die Sie zur Verfügung stellen. Mein Bewerbungsablauf ist der gleiche wie in den oben erwähnten Java-Klassen. können Sie bitte ein Code-Snippet zur Verfügung stellen, um validateAccountInformation (requestDTO) -Methode in der Testfall-Methode submitRequestForLPAAccountTest() der Junit-Testklasse - Koos Gadellaa aufzurufen. Danke – Rij

+0

Ich möchte einen Testfall schreiben, um zu prüfen, ob businessCalendar.nextBusinessDay (LocalDateHelper.today(), LPAConstants.TWENTY_BUSSINESS_DAYS), die in ValidateAccountInformation (..) -Methode ist, 20 Tage omly als Eingabe gegeben wird (dh LPAConstants.TWENTY_BUSSINESS_DAYS sollte sein 20 zugewiesen). Wenn ein anderer Wert als 20 angegeben wird, sollte der Test fehlschlagen. – Rij

+0

Wenn Sie BusinessCalendar.nextBusinessDay() testen möchten, schreiben Sie einen Junit-Testfall für BusinessCalendar. Darin testen Sie, ob eine Ausnahme für die entsprechenden Methoden ausgelöst wird. In Ihrem Validierer injizieren Sie wahrscheinlich Ihr Business-Kalender-Objekt (wenn nicht, sollten Sie.Entweder mit Spring-DI, oder wenn das nicht möglich ist, überschreiben Sie einfach das Feld mit Spring-Tests 'ReflectionUtils' mit einem Mock, damit Sie überprüfen können, ob der entsprechende Aufruf erfolgt ist. –

Verwandte Themen