gpt4 book ai didi

java - Mockito Matchers isA、any、eq 和 same 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 20:57:34 24 4
gpt4 key购买 nike

我对它们之间的区别以及在哪种情况下选择哪个感到困惑。有些区别可能很明显,例如 anyeq,但我将它们都包括在内只是为了确定。

我想知道它们的区别,因为我遇到了这个问题:我在 Controller 类中有这个 POST 方法

public Response doSomething(@ResponseBody Request request) {
return someService.doSomething(request);
}

并且想对该 Controller 执行单元测试。我有两个版本。第一个是简单的,像这样

@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")));
}

两者都运作良好。但我希望我的 someServiceMock.doSomething() 在 MockMvc 方法中接收 req,或者至少是一个与 req 具有相同变量值的对象>(不仅仅是任何 Request 类),并返回 res,就像第一个一样。我知道使用 MockMvc 方法是不可能的(或者是吗?),因为在实际调用中传递的对象总是与在模拟中传递的对象不同。无论如何我可以做到这一点吗?或者这样做是否有意义?或者我应该对使用 any(Request.class) 感到满意吗?我试过eqsame,但都失败了。

最佳答案

  • any() 绝对没有检查。从 Mockito 2.0 开始, any(T.class) 分享 isA语义表示“任何 T”或正确地表示“任何 T 类型的实例”。

    This is a change compared to Mockito 1.x , 其中 any(T.class) 在 Java 8 之前,除了保存一个强制转换外,什么都没有检查:“任何类型的对象,对于给定的类不是必需的。提供类参数只是为了避免强制转换。”

  • isA(T.class) 检查参数 instanceof T , 表示它是非空的。

  • same(obj) 检查参数是否指向与 obj 相同的实例,这样 arg == obj是真的。

  • eq(obj) 检查参数是否等于 obj根据其equals方法。如果您在不使用匹配器的情况下传递实际值,这也是这种行为。

    请注意,除非 equals被覆盖,您将看到默认的 Object.equals 实现,其行为与 same(obj) 相同.

如果您需要更精确的自定义,您可以为自己的谓词使用适配器:

  • 对于 Mockito 1.x,请使用 argThat 带有定制的 Hamcrest Matcher<T>准确选择您需要的对象。
  • 对于 Mockito 2.0 及更高版本,请使用 Matchers.argThat 带有自定义org.mockito.ArgumentMatcher<T> , 或 MockitoHamcrest.argThat 带有定制的 Hamcrest Matcher<T> .

您也可以使用 refEq ,它使用 reflection 来确认对象相等; Hamcrest 与 SamePropertyValuesAs 有类似的实现。用于公共(public) bean 样式的属性。请注意,在 GitHub issue #1800 proposes deprecating and removing refEq , 在那个问题中你可能更喜欢 eq更好地让您的类(class)更好地封装他们的平等感。

关于java - Mockito Matchers isA、any、eq 和 same 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30890011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com