19

我正在尝试在 Mock 上使用 Mockito 来执行此操作:
当 Mock.someMethod(..) 用 argument1 调用时 --> return result1
当 Mock.someMethod(..) 用 argument2 调用时 --> return result2
当 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 异常,因为它出于某种原因尝试使用 null agrument 运行 Matcher。我不确定它是否受支持。

如果这不是正确的方法,如何使用 Mockito 来实现?谢谢。

4

3 回答 3

29

而不是写

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

同样对于result2result3

这在http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#12中有描述,但在我看来,文档并不清楚这个结构实际上是需要的。案子。我将与 Mockito 团队的其他成员讨论如何改进此处的文档。

祝你好运。

于 2012-12-13T02:19:45.730 回答
3

根据经验,如果测试失败,您应该能够查明被测单元的问题。避免专门为一项测试编写自定义匹配器。如果一个方法需要返回多个值,通常只需通过按测试预测的顺序返回值来简单地存根该方法就足够了。

例如

when(mock.method(any(Object.class))).thenReturn(result1, result2, result3);

这将在第一次调用时返回结果 1,在第二次调用时返回 result2,依此类推。

显然在某些情况下这是不够的,但通常情况下,越简单的测试越好。

于 2012-12-12T21:57:10.847 回答
2

通过在自定义 ArgumentMatcher 中进行空检查,我现在能够解决这个问题。它起作用了,因为 NPE 仅在 Mockito 调用 when() 语句时才在启动期间。此时它甚至不应该调用 ArgumentMatcher.matches() !感觉就像 Mockito 中的一个错误。

于 2012-12-12T22:27:21.017 回答