- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
Mockito 似乎是一个非常漂亮的 Java stub /模拟框架。唯一的问题是我找不到任何关于使用他们的 API 的最佳方式的具体文档。测试中常用的方法包括:
doXXX(???) : Stubber
when(T) : OngoingStubbing
then(T) : OngoingStubbing
verify(???) : T
given(T) : BDDOngoingStubbing
willXXX(???) : BDDStubber
当您在实践中看到 Mockito 示例时,您会看到如下代码:
when(yourMethod()).thenReturn(5);
从我读过的所有文档中,我已经确定了 Mockito “语法”的几个“模式”,这些模式是通过将这些方法调用以菊花链方式连接在一起的,就像上面的示例一样。我发现的一些常见模式是:
When/Then: when(yourMethod()).thenReturn(5);
Given/Will: given(yourMethod()).willThrow(OutOfMemoryException.class);
Do/When: doReturn(7).when(yourMock.fizzBuzz());
Will/Given/Do: willReturn(any()).given(yourMethod()).doNothing();
Verify/Do: verify(yourMethod()).doThrow(SomeException.class);
我感到窒息的是如何选择正确的方法调用模式/组合来为我的测试用例建模。似乎您可以将它们以看似无穷无尽的组合菊花链式连接在一起,但我不确定哪种模式适合哪个问题。
Mockito 大师能否帮助阐明 Mockito 方法的哪些模式/组合用于哪些类型的测试用例(以及为什么)?提前致谢!
最佳答案
when/thenReturn
、when/thenThrow
和 when/then
语法有几个缺点。例如,
when/thenReturn
的情况下,如果返回类型是带有 a 的泛型通配符,并且您希望返回相同类型的模拟,您将无法以避免编译警告。 when/thenThrow
和 when/then
用于 void 方法。when
,方法和参数,除非您在模拟上调用 reset
。 when
对象和方法,当您使用参数匹配器时,可能会导致问题。我发现这些案例很难记住。因此,与其尝试跟踪何时when/thenReturn
、when/thenThrow
和 when/then
语法会和不会起作用,我更愿意完全避免使用它们,而赞成doReturn/when
、doThrow/when
和 doAnswer/when
备选方案。也就是说,由于您偶尔会需要 doReturn/when
、doThrow/when
和 doAnswer/when
,因此您可以始终使用这些方法,学习如何使用 when/thenReturn
、when/thenThrow
和 when/then
毫无意义。
注意 doReturn
、doThrow
和 doAnswer
可以像 thenReturn
一样链接在一起,thenThrow
和 then
。他们没有的是在对 doReturn
、doThrow
和 的一次调用中返回多个值(或抛出多个异常,或运行多个答案)的选项回答
。但我发现我很少需要这样做,这并不重要。
doReturn
还有一个缺点,我认为这无关紧要。您不会像使用 when/thenReturn
那样在编译时检查其参数的类型。所以如果你弄错了参数类型,在你运行测试之前你不会发现。坦白说,我不在乎。
那么总结一下,我用Mockito已经两年多了,我考虑一致使用doReturn
、doThrow
和doAnswer
成为 Mockito 最佳实践。其他 Mockito 用户不同意。
关于java - 形成 Mockito "grammars",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11462697/
我正在使用 Grammar::Tracer使用以下设置: 第6页 use v6; use lib '.'; use MyGrammar; my $res = MyGrammar.parse('hell
我要赞一个.sql文件使用 Perl 6 语法,我想知道我在解析时是否可以跳过一些不相关的行? 例如:我想跳过 DROP行,/*!....!*/行,--行,以及 CREATE TABLE 之外的空白在
我是 CFG 的新手, 有人可以给我创建生成某种语言的 CFG 的提示吗 例如 L = {am bn | m >= n} 我得到的是: So -> a | aSo | aS1 | e S1 -> b
要了解 perl6 如何解析您的代码,您可以使用 --target 选项: $ perl6 --target=parse -e '"Hello World".say' - statementlist:
预期的语言是这样的: NikeToyota... 我遇到的困难是如何指定以确保在一对标签中,开始标签和结束标签都具有相同的名称。 tag是长度小于 10 的 [a-zA-Z] 的组合。 data 最佳
我很难确定这个语法是否有歧义。如何检查它是否有歧义? G = ({S,A,B}, {0,1}, P, S} P: S → 0B | 1A A → 0 | 0S | 1AA B → 1 | 1S | 0
有没有工具可以检查我的 bnf 语法?例如: ::== ::=A|B|C ::=+ | A = B + C 根据我的 bnf 语法是一个有效的陈述并且A = B * C 不是。 有没
我正在尝试使用以下方法修改已解析的 Grammar 对象中的值: method mutate(Match:D $match --> Match:D) { for $match.values -
我在谷歌上搜索了上下文敏感的引理,它似乎只产生上下文无关语言的结果。 Pumping lemma 只能证明一种语言是上下文无关的吗?而不是上下文敏感? 知道怎么做吗? 最佳答案 抽水引理存在于常规的、
我正在查看以下语法,我相信它在第 3 行有歧义,但不确定。 → → → i e → i → x → y → 5 → 13 我找到了这个字符串 xi13yi5xeyx我相
您使用什么算法来枚举由上下文无关文法生成的字符串? 当没有递归时,这似乎是可行的,但我无法弄清楚在一般情况下如何做到这一点,其中可能包含各种(可能是间接的)递归。 (我不是在寻找像 this page
鉴于: 我不知道接受的语言是什么。 通过查看它,您可以获得几个最终结果: 1.) bb 2.) ab(a,b) 3.) bbab(a, b) 4.) bbaaa 最佳答案 如何为DFA编写正则表达式
S -> bA|aB A -> a|aS|bAA B -> b|bS|aBB 除了试图找到一个会生成两个解析树的字符串之外,还有什么简单的方法吗? 有人可以给我一个可以证明这一点的字符串。 最佳答案
我们在类里面学习歧义,下面的语法是作为歧义语法的一个例子。我只是没有看到它是如何模棱两可的。是否存在人们用来确定歧义的固定模式或方法,还是就像逻辑谜题一样,您必须通过组合来查找语法中的歧义句子?我在网
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
根据文档,您可以在语法中redefine the ws 标记,在某些情况下,该标记会被自动调用,例如: grammar Numbers { rule TOP { \d \d } }; my $resu
如 this issue 所示,一些标记名称与语法的类层次结构中的方法名称冲突(包括 Match 、 Capture 、 Cool 、 Any 和显然 My .)。例如,`Mu.item gramma
我有这种语言: {an bm | m+n is an even number} 什么是正确的语法? 最佳答案 S -> aaS | aB | bbC | ε B -> bbB | b C -> bbC
Grammars是类,因此,它们应该遵守与其他类相同的规则。但是,从语法中导出正则表达式似乎存在问题: grammar Word { token TOP { ^ $} regex l
这个通用语法有什么作用? S -> LR L -> L0Y L -> LX X1 -> 1X X0 -> 0X X0 -> 1Y Y1 -> 0Y YR -> R L -> epsilon
我是一名优秀的程序员,十分优秀!