【发布时间】:2015-01-06 02:02:43
【问题描述】:
我想使用mockmvc 来测试 Spring 推荐的控制器。但是,我还必须使用jmockit 来模拟依赖关系。
问题是 jmockit 不能很好地处理mockmvc,无论是standaloneSetup() 还是webAppContextSetup()。
另一个名为 Mockito 的模拟工具很好地解决了这个问题,但它在模拟依赖项方面有很多限制。
所以,任何人有经验或想法,请告诉我。非常感谢。
示例代码如下:
第一个是带有 Spring 的 MockMvc 的 Mockito 到单元测试控制器。这运行良好。
public class TestControllerTest {
@InjectMocks
private LoginController loginController;
@Mock
private LoginService loginService;
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(loginController).build();
}
@Test
public void testLogin() throws Exception {
when(loginService.login()).thenReturn(false);
this.mockMvc.perform(get("/login"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(view().name("goodbyeworld"))
.andReturn();
}
}
其次,jmockit 如下。不幸的是,loginController 在 setup 方法中为空。而且,如果我只是在@Tested 方法中调用loginController.xxx() 就可以了。我认为这表明loginController 在@Tested 方法之前但在@Before 方法之后实例化。
public class TestControllerTest2 {
@Tested
private LoginController loginController;
@Injectable
private LoginService loginService;
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
this.mockMvc = MockMvcBuilders.standaloneSetup(loginController).build();
}
@Test
public void testLogin() throws Exception {
new Expectations() {{
loginService.login(); result = false;
}};
this.mockMvc.perform(get("/login"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(view().name("goodbyeworld"))
.andReturn();
}
}
那么,如何解决这个问题呢? jmockit 的少数初始化方法?有可能吗?
【问题讨论】:
-
你能澄清一下吗?我不知道您所说的独立/webappcontext 设置是什么意思。使用 mockmvc 的示例测试类会有所帮助。
-
@Rogério,你注意到我的问题真是太棒了。很抱歉这么久的更新。顺便说一句,jmockit 真的很强大。
-
这不太符合 JMockit 的精神,但您始终可以在
@Before方法中自己实例化loginController。 -
@dcsohl,自己实例化 loginController 很简单。但是,如果我这样做,则无法自动注入依赖对象。这也是困扰我的。
标签: spring unit-testing jmockit