我有一个接口foo
和方法int foo.bar(int)
,我想用mockito模拟它。如果传入1
,我希望mocked方法返回99
,但所有其他值都将引发异常。我可以这么做吗?
final Foo foo = mock(Foo.class);
when(foo.bar(1)).thenReturn(99);
when(foo.bar(anyInt())).thenThrow(new IllegalArgumentException());
换句话说,1
是否优先于anyint()
?我不希望它为1
抛出异常。文档说,对于多个定义,最后一个定义更重要,但我不知道这是否意味着相同的参数。如果在这里适用,我是否需要首先定义通配符anyint()
?或者两者之间是否有任何关系,因为其中一个是匹配者,而另一个只是价值?
您有两个选项:匹配“除一个以外的任何值”,以及重写stubbing。(我想对于复杂的自定义行为,您也可以使用一个答案,但对于像这样的情况,这是矫枉过正的。)
Mockito的additionalMatchers
类提供了许多有用的匹配器,包括诸如not
之类的运算符。这将允许您为除特定值(或表达式)之外的所有值设置行为。
when(foo.bar(1)).thenReturn(99);
when(foo.bar(not(eq(1)))).thenThrow(new IllegalArgumentException());
请注意,运算符必须与匹配器一起使用,而不是与值一起使用,可能需要matchers.eq
作为显式的equals
匹配器,这是由于Mockito的参数匹配器堆栈:
/* BAD */ when(foo.bar(not( 1 ))).thenThrow(new IllegalArgumentException());
/* GOOD */ when(foo.bar(not(eq(1)))).thenThrow(new IllegalArgumentException());
对于stubbing,最后定义的匹配链获胜。这允许您在@before
方法中设置常规测试fixture行为,并在单独的测试用例中重写它,如果您愿意的话,但也意味着顺序在您的stubbing调用中很重要。
when(foo.baz(anyInt())).thenReturn("A", "B"); /* or .thenReturn("A").thenReturn("B"); */
when(foo.baz(9)).thenReturn("X", "Y");
foo.baz(6); /* "A" because anyInt() is the last-defined chain */
foo.baz(7); /* "B" as the next return value of the first chain */
foo.baz(8); /* "B" as Mockito repeats the final chain action forever */
foo.baz(9); /* "X" because the second chain matches for the value 9 */
foo.baz(9); /* "Y" forever because the second chain action still matches */
因此,您永远不会按照问题中列出的顺序看到这两个存根,因为如果一个通用匹配紧随特定匹配之后,那么该特定匹配将永远不会被使用(甚至可能被删除)。
请注意,在重写间谍或危险的stubbed行为时,有时需要将语法更改为doanswer
。Mockito知道在进行验证或沿着thenverb
链前进时不要计算对的调用,但是异常仍然可能导致测试失败。
/* BAD: the call to foo.bar(1) will throw before Mockito has a chance to stub it! */
when(foo.bar(anyInt())).thenThrow(new IllegalArgumentException());
when(foo.bar(1)).thenReturn(99);
/* GOOD: Mockito has a chance to deactivate behavior during stubbing. */
when(foo.bar(anyInt())).thenThrow(new IllegalArgumentException());
doReturn(99).when(foo).bar(1);
问题内容: 众所周知,代理对象时,例如为Spring / EJB创建具有事务属性的Bean时,甚至当您使用某些框架创建部分模拟时,代理对象都不知道,内部调用也不会重定向,然后也没有被拦截… 这就是为什么如果您在Spring中做类似的事情: 当您致电doSomething时,您希望除了主要交易外还有3个新交易,但是实际上,由于这个问题,您只会得到一个新交易… 所以我想知道您如何处理此类问题… 实际上
我已经浏览了Python文档提供的信息,但我仍然有点困惑。有人可以发布示例代码来编写一个新文件,然后使用pickle将字典转储到其中吗?
我正在实现一个定制的Kotlin CoroutineScope,它处理通过WebSocket连接接收、处理和响应消息。作用域的生命周期与WebSocket会话相关联,因此只要WebSocket处于打开状态,它就处于活动状态。作为协同程序作用域上下文的一部分,我安装了一个自定义异常处理程序,如果出现未处理的错误,它将关闭WebSocket会话。是这样的: 我惊讶地发现异常处理程序不仅接收异常,而且实
A task is special because knowing when a task is about to exit is useful in these circumstances: Frameworks know when to render the UI. Measuring enter/leave allows knowing total script/task time. Exi
注意在前面的例子中,我们对调用 parse 的最直接反应就是将错误从库错误映射到我们的新的自定义错误类型(原文:Notice in the previous example that our immediate reaction to calling parse is to map the error from a library error into our new custom error t
我正在从V2-V3迁移谷歌日历API的过程中。我需要更新另一个用户日历列表。在V2中,通过重写OAuth令牌上的requestor_id字段,这是可能的。但是现在我也在使用OAuth2,这个技术不起作用了。 列出日历列表的请求是: 使用Calendar API V3可以实现此功能吗?
我正在为多模块项目编写Gradle1.4构建文件。所以有根构建。gradle定义如下: 它定义了所有子模块的生成任务。子模块包含在设置中。gradle和每个模块都有其具有已定义依赖项的构建文件。 现在,在主构建文件中,我添加了一些额外的项目范围任务,如:aggregateJavadoc(将所有javadoc收集到一个文件中)或bundleJar(从所有类创建bundle jar),等等。手动调用时