Sil*_*lly 35 java unit-testing matcher mockito difference
我很困惑他们之间有什么区别,在哪种情况下选择哪一个.一些差异可能是显而易见的,比如any和eq,但我把它们都包括在内只是为了确定.
我想知道他们之间的差异,因为我遇到了这个问题:我在Controller类中有这个POST方法
public Response doSomething(@ResponseBody Request request) {
return someService.doSomething(request);
}
Run Code Online (Sandbox Code Playgroud)
并希望在该控制器上执行单元测试.我有两个版本.第一个是简单的,就像这样
@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));
}
Run Code Online (Sandbox Code Playgroud)
但我想使用像这样的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")));
}
Run Code Online (Sandbox Code Playgroud)
两者都运作良好.但我希望我someServiceMock.doSomething()在MockMvc方法中接收req,或者至少是一个具有相同变量值的对象req(不仅仅是任何Request类),并返回res,就像第一个一样.我知道使用MockMvc方法是不可能的(或者是吗?),因为实际调用中传递的对象总是与mock中传递的对象不同.无论如何我能做到吗?或者这样做甚至有意义吗?或者我应该满意使用any(Request.class)?我试过了eq,same但是所有这些都失败了.
先感谢您.我希望我能很好地解释自己.
Jef*_*ica 70
any()绝对没有检查.在Mockito 1.x中,any(T.class)也绝对不会检查任何东西,但也会为你节省一个演员阵容(在Java 8之前).
这是由于Mockito 2.0及更高版本的变化,何时any(T.class)将isA语义分享为"任何T"或正确"任何类型的实例T".any()仍然会检查一切.
isA(T.class)检查参数instanceof T,暗示它是非null.
same(obj)检查参数是否与实例相同obj,这arg == obj是真的.
eq(obj)obj根据equals方法检查参数是否等于.如果在不使用匹配器的情况下传递实际值,这也是一种行为.
请注意,除非equals被覆盖,否则您将看到默认的Object.equals实现,它具有与之相同的行为same(obj).
如果需要更精确的自定义,可以使用适配器作为自己的谓词:
argThat自定义Hamcrest Matcher<T>,精确选择您需要的对象.Matchers.argThat自定义org.mockito.ArgumentMatcher<T>或MockitoHamcrest.argThat自定义Hamcrest Matcher<T>.| 归档时间: |
|
| 查看次数: |
51414 次 |
| 最近记录: |