如何在Spring的UnitTest中将对象添加到模型中

时间:2017-03-14 10:52:16

标签: spring unit-testing spring-mvc mocking spring-test

我的代码:

@Controller 
public class Controller {
   @Autowired
   Service service;

   @RequestMapping(value = "/")
   public ModelAndView showPage() {
      ModelAndView modelAndView = new ModelAndView();
      Object object = service.findObject();
      modelAndView.addObject("modelObject", object);
      m.setViewName("page")
      return modelAndView;
}

@Service
public class Service {
   public Object findObject() {
      // goes to database and finds object
      return object;
}

我想测试隔离控制器(即控制器上的UnitTest)。
这是我测试的片段:

@Mock
Service serviceMock;

@InjectMocks
Controller controller;

@Test
when(serviceMock.findObject()).thenReturn(new Object());

mockMvc.perform(get("/")).
   andExpect(model().attribute("modelObject", hasSize(1)));

所以这里的问题是:"期待"测试失败,因为模型是空的。实际上服务是模拟的(这就是我想要的,实际上我想要单独测试控制器),所以它不会进入数据库并且找不到对象。
我该怎么测试呢?如何模拟应将对象添加到模型中的事实?

1 个答案:

答案 0 :(得分:1)

你是否尝试过愚蠢的简单方法,使用Moktio(或其他一些Mocking Framework)但没有Spring。

import static org.mockito.Mockito.*;
...


@Test
public void test(){
    Service serviceMock = mock(Service.class)
    when(serviceMock findObject()).thenReturn(new Object());

    Controller controller new Controller();
    controller.setService(serviceMock);

    ModelAndView result = controller.showPage();
    assertThat(model().attribute("modelObject"), hasSize(1));
}