2013-09-24 3 views
0

Я пытаюсь написать тесты для моего контроллера пружины и проблемы. Следующий код всегда возвращает redirect:/welcome, хотя у меня есть when(result.hasErrors()).thenReturn(true);, который должен вернуть add. Может быть, я делаю что-то неправильно. Помогите мне решить это, пожалуйста.Mockito when(). ThenReturn не работает

Контроллер

@Controller 
public class SpringController { 

@Autowired 
private UserService userService; 

@Autowired 
private CorrectValidator correctValidator; 

@Autowired 
private ExistValidator existValidator; 

@Autowired 
private Unwrapper unwrapper; 

    @RequestMapping(value = "/create", method = RequestMethod.POST) 
    public String create (Wrapper wrapper, 
         BindingResult result) 
     throws ParseException { 
     correctValidator.validate(wrapper, result); 
     existValidator.validate(wrapper, result); 
     if (result.hasErrors()) { 
      return "add"; 
     } 
     userService.create(unwrapper.unwrap(wrapper)); 
     return "redirect:/welcome"; 
    } 
} 

Тест

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring-servlet.xml"}) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class}) 
public class ControllerTest { 

@InjectMocks 
private SpringController controller; 

@Mock 
private Wrapper wrapper; 

@Mock 
private BindingResult result; 

@Before 
public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 
    mockMvc = standaloneSetup(controller) 
      .setSingleView(mockView) 
      .build(); 
} 

    @Test 
    public void testCreateBad() throws Exception { 
     when(result.hasErrors()).thenReturn(true); 

     mockMvc.perform(post("/create", wrapper, result)) 
       .andExpect(status().isOk()) 
       .andExpect(view().name("add")); 
    } 

} 

ответ

2

Проблема заключается в том что вы не используете метод post() правильно. See the javadoc here.

В рассуждениях вы передаете

post("/create", wrapper, result) 

wrapper и result используются в качестве URL-адреса переменных, а не в качестве аргументов метода для вашего метода create. Вы не можете высмеивать BindingResult таким образом. На самом деле это очень сложно сделать, чтобы издеваться над этим и, вероятно, не стоило этого в конечном счете. Если что-то вам нужно проверить с помощью объектов команды, которые будут или не будут действительны.

+0

Так как я могу правильно передать результат контроллеру? – qiGuar

+0

@qiGuar Как я уже сказал в своем ответе, я не думаю, что есть простой и достойный способ сделать это. –

Смежные вопросы