- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我对它们之间的区别以及在哪种情况下选择哪个感到困惑。有些区别可能很明显,例如 any
和 eq
,但我将它们都包括在内只是为了确定。
我想知道它们的区别,因为我遇到了这个问题:我在 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)
感到满意吗?我试过eq
,same
,但都失败了。
最佳答案
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)
相同.
如果您需要更精确的自定义,您可以为自己的谓词使用适配器:
argThat
带有定制的 Hamcrest Matcher<T>
准确选择您需要的对象。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/
尝试使用 spacy matcher 时出现错误: ~\Anaconda3\lib\site-packages\spacy\matcher\matcher.pyx in spacy.matcher.m
我想检查一个字符串是否包含另一个字符串,忽略大小写。基本上,我想这样做: assertThat(dialogTitle.getText(), containsString(equalToIgnorin
我想断言 ICollection 包含满足约束集合的项目。对于 Java Hamcrest,我会使用 Matchers.containsInAnyOrder(Matcher... matchers)。
如果我有一个 Matcher[A],如何创建一个只有当 Iterable 的每个元素都满足原始 Matcher 时才满足的 Matcher[Iterable[A]]。 class ExampleSpe
这将是一个简单的问题,但如果我的类路径中包含两个库,我找不到它们之间的区别以及使用哪一个? 最佳答案 Hamcrest 匹配器方法返回 Matcher和 Mockito 匹配器返回 T。因此,例如:o
给定一个序列 Seq[Matcher[A]]我要索取单Matcher[A]当序列中的所有匹配器都成功时,它就成功了。 编辑 我自己提供的答案似乎有点笨拙,此外,如果该序列的所有失败匹配器都产生结果,那
我看到了这个post 关于两者的区别: Matchers.hasItem(..) Assert.assertThat(items, Matchers.hasItem(Matchers.hasToStr
我对以下之间的区别有点困惑: Matcher m; m.group(); 和 Matcher m; m.pattern().pattern(); 它们都从列表中返回正确的匹配项,但我不明白两者之间的区
我正在使用 while(matcher.find()) 循环访问文件并从中检索内容。我想知道如果我知道我找到的内容的索引位于 matcher.start() 中,我将如何从这个循环中获取行号。 我很困
我试过这个例子,只是交换了两条线,它给出了不同的输出,为什么 String inputString = "username@gmail.com"; String pattern="([a-z]+@)(
以下代码在首次运行时给出异常。但是当我在匹配器行上设置断点并在 Netbeans Watcher 中评估一些命令时。有用。为什么?? String regex = "/I-TASSER/output/
是否有 Matcher.appendReplacement() 和 Matcher.appendTail() 的替代方案,它采用 StringBuilder 而不是 StringBuffer ? 是否
我需要在循环中“缩短”字符串,然后一次又一次地传递它以与 java.regex.Pattern 匹配。对于一些深入参与解析和文本处理的人来说,这可能是一个微不足道的情况。 我面临着必须使用的情况: s
为什么第一个 block 有效而第二个 block 不有效? int numberOfDigits = 2; Pattern p = Pattern.compile("[01]{"+numberOfD
我是 c# 的新手,正在尝试将以下代码转换为 c#,但在 c# 中找不到任何 api 来执行此操作。 请解释 matcher.start() 和 matcher.end() 的等价物。 c# 中 ma
我注意到调用 Matcher.lookingAt() 会影响 Matcher.find()。我在我的代码中运行了 lookingAt(),它返回了 true。然后,当我运行 find() 以便开始返回
我正在进行一些测试,以便重构一个旧的 C++ 项目。我正在尝试使用 gmock 匹配器 ElementsAreArray() 来匹配两个数组。 EXPECT_THAT(value_instance.v
我正在寻找一种方法来确定单个正则表达式是否匹配整个字符串、字符串的开头或 C# 中的一部分。 在 Java 中,您可以构造一个 Matcher 对象,并使用方法 matches() 来检查它是否与整个
给定一个 Collection 或 Iterable 项目,是否有任何 Matcher(或匹配器组合)可以断言每个项目都匹配一个匹配器? 例如,给定这个项目类型: public interface P
我看到有一些关于 Java Matcher 类的帖子,但我找不到关于特定方法 find() 和 group() 的帖子. 我有这段代码,其中 Lane 和 IllegalLaneException 已
我是一名优秀的程序员,十分优秀!