我正在尝试使用模拟上的Mockito来做到这一点:
当 Mock.someMethod(..) 被调用时,参数 1 -->返回结果 1
当 Mock.someMethod(..) 被调用时,参数 2 -->返回结果 2
当 Mock.someMethod(..) 被调用时 参数 3 -->返回结果 3
when(mock.method(Matchers.argThat(new MyMatcher1() {
@Override
public boolean matches(Object arg0) {
// comparision logic
}
}))).thenReturn(result1);
when(mock.method(Matchers.argThat(new MyMatcher2() {
@Override
public boolean matches(Object arg0) {
// comparision logic
}
}))).thenReturn(result2);
when(mock.method(Matchers.argThat(new MyMatcher3() {
@Override
public boolean matches(Object arg0) {
// comparision logic
}
}))).thenReturn(result3);
但是 Mockito 正确地存根了第一个,但在第二个上它抛出了 NullPointer 异常,因为它出于某种原因试图以空 agrument 运行匹配器。我不确定它是否受支持。
如果这不是正确的方法,如何使用Mockito实现这一目标?谢谢。
而不是写
when(mock.method(Matchers.argThat(new MyMatcher1() {
@Override
public boolean matches(Object arg0) {
// comparison logic
}
}))).thenReturn(result1);
试试这个。
doReturn(result1).when(mock).method(Matchers.argThat(new MyMatcher1() {
@Override
public boolean matches(Object arg0) {
// comparison logic
}
}));
同样适用于result2
和result3
.
这在 http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#12 中有所描述,但在我看来,文档不清楚在这种情况下实际需要这种构造的事实。 我将与 Mockito 团队的其他成员讨论如何改进此处的文档。
祝你好运。
根据经验,如果测试失败,您应该能够查明被测单元的问题所在。避免专门为一个测试编写自定义匹配器。如果方法需要返回多个值,则通常只需按测试预测的顺序返回值来存根方法即可。
例如
when(mock.method(any(Object.class))).thenReturn(result1, result2, result3);
这将返回结果 1 一个是第一次调用,结果 2 是第二次调用,依此类推。
显然,在某些情况下,这是不够的,但通常情况下,更简单的测试是更好的测试。
我现在能够通过在自定义 ArgumentMatch 中进行空检查来解决这个问题。它有效,因为 NPE 仅在 Mockito 调用 when() 语句时在启动期间。它甚至不应该在这个时候调用 ArgumentMatcher.matches()!感觉就像Mockito中的一个错误。