2016-08-01 2 views
0

Мы разрабатываем приложение с использованием весеннего mvc-фрейма. Я привел все классы ниже, пожалуйста, предложите написать тестовый пример junit для приведенного ниже сценария.junit test case for spring MVC

Я хочу написать тестовый пример junit для метода validateAccountInformation (requestDTO), который вызывается в методе validateAccount (..) класса LPAValidator.java. Ниже приведен пример моего junit, за которым следуют классы java. Фактический вызов происходит из файла LPAController.java, как показано в приведенном ниже коде.

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-класс для валидаций

@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 
     } 

Пожалуйста, укажите, что нужно добавить в LPAControllerTest.java, чтобы проверить nextBusinessDay (..), как описано выше.

+0

Хотя дискуссий есть, я думаю, что это чаще писать LPAController в LpaController, только заглавные буквы, а не аббревиатуры (хотя они и есть). Конечно, у вас будет HTTPServlet (или HttpServlet), который его разрывает, но ... –

ответ

2

Вы пытаетесь написать тест интеграции, в котором вызывается ваш контроллер, который затем вызывает все подклассы до тех пор, пока не будет активирован валидатор. Это не традиционный «модульный тест».

Традиционный модульный тест просто проверит валидатор прямо и не более.

Тем не менее, при написании теста интеграции, spring documentation to the rescue
Короче говоря, это будет требовать вам создать ApplicationContext всем необходимым подмостей, а затем использовать вызов mockMvc сделать GET на созданном приложении.

Если вы хотите протестировать валидатор, использовать простые насмешливые рамки: См [http://mockito.org] дает вам что-то вроде этого:

@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

Поскольку я новичок в Spring, ссылка, предоставленная мной, меня сбивает с толку. Мой поток приложений такой же, как показано в вышеупомянутых классах Java. можете ли вы предоставить фрагмент кода для вызова метода validateAccountInformation (requestDTO) в методе тестового примера submitRequestForLPAAccountTest() тестового класса junit - Koos Gadellaa. Спасибо – Rij

+0

Я хочу написать тестовый пример, чтобы проверить, если businessCalendar.nextBusinessDay (LocalDateHelper.today(), LPAConstants.TWENTY_BUSSINESS_DAYS), который находится в validateAccountInformation (..) метод, предоставляется 20 дней в качестве ввода (то есть, LPAConstants.TWENTY_BUSSINESS_DAYS должен быть назначено на 20). Если задано какое-либо значение, отличное от 20, тест должен завершиться неудачей. – Rij

+0

Если вы хотите протестировать BusinessCalendar.nextBusinessDay(), вы пишете тестовый файл junit для BusinessCalendar. В этом случае вы проверяете, выбрано ли исключение для соответствующих методов. В вашем валидаторе вы, вероятно, вводите свой бизнес-объект календаря (если нет, то вам следует.Либо с пружиной-DI, либо если это невозможно, просто перепишите поле с помощью весенних тестов 'ReflectionUtils' с макетом, чтобы вы могли убедиться, что соответствующий вызов сделан. –