我不确定它们之间的区别是什么,以及在哪种情况下选择哪个。有些差异可能很明显,比如any
和eq
,但我把它们都包括进来只是为了确认。
我想知道它们之间的差异,因为我遇到了这个问题: 我在一个Controller类中有这个POST方法。
public Response doSomething(@ResponseBody Request request) {
return someService.doSomething(request);
}
我希望你能为那个控制器进行单元测试。 我有两个版本。第一个版本很简单,就像这样
@Test
public void testDoSomething() {
//initialize ObjectMapper mapper
//initialize Request req and Response res
when(someServiceMock.doSomething(req)).thenReturn(res);
Response actualRes = someController.doSomething(req);
assertThat(actualRes, is(res));
}
但我想使用类似这样的MockMvc方法
@Test
public void testDoSomething() {
//initialize ObjectMapper mapper
//initialize Request req and Response res
when(someServiceMock.doSomething(any(Request.class))).thenReturn(res);
mockMvc.perform(post("/do/something")
.contentType(MediaType.APPLICATION_JSON)
.content(mapper.writeValueAsString(req))
)
.andExpect(status().isOk())
.andExpect(jsonPath("$message", is("done")));
}
两种方法都可以很好地工作。但是我希望在MockMvc方法中,我的someServiceMock.doSomething()
能够收到req
或者至少是一个具有与req
相同变量值的对象(而不仅仅是任何Request
类)并且返回res
,就像第一种方法一样。我知道使用MockMvc方法做到这一点是不可能的(或者说可以吗?),因为实际调用中传递的对象与模拟中传递的对象总是不同的。我能否以某种方式实现这一点?或者这样做是否有意义?或者我应该满足于使用any(Request.class)
?我已经尝试过eq
、same
,但它们都失败了。
equals
时的风险以及使用argThat
进行自定义的方法。 - hc_devrefEq()
。当比较的对象没有实现 equals() 方法时,可以使用此匹配器。该匹配器使用 Java 反射 API 来比较所需对象和实际对象的字段。 - IvanrefEq
的提及,包括 建议从 Mockito 中弃用并删除它的提案。 - Jeff Bowman