模仿时无效的匹配器

时间:2016-07-15 21:47:05

标签: java android mocking mockito

我想测试一下这个方法:

li

工厂走这条路

public void some_method(SomeFactory someFactory) {
        A a = someFactory.populateWithParameter(parameter1, parameter2, parameter3, parameter4); 
        a.method_call();
        ....   
    }

并且测试是

public class SomeFactory(){

 // some constructor
public A populateWithParameter(SomeClass1 someClass1, SomeClass2 someClass2, String string, int parameter){
 return new A(someClass1, someClass2, string, parameter)
} 
}

我收到此消息

public void testSomeMethod() throws Exception {
        SomeFactory someFactory = mock(SomeFactory.class);
        when(someFactory.populateWithParameter(
                any(SomeClass1.class), any(SomeClass2.class),
             anyString(), anyInt())).thenReturn(notNull());

        mainActivity.some_method(someFactory);
...
    }

1 个答案:

答案 0 :(得分:0)

您不能使用notNull()作为返回值。 Mockito匹配器仅代表调用whenverify的参数,并且不能作为返回值。特别是,notNull()实际上会返回null 并将“not null”匹配标记为隐藏堆栈的副作用,它会在下一次与模拟交互之前保持不变(当你实际上是调用some_method)。

虽然您没有列出InvalidUseOfMatchersException的堆栈跟踪,但我敢打赌,当您通过populateWithParameter 调用 some_method时,实际上会发生错误,而不是你的存根populateWithParameter。 “1记录”匹配器是notNull(),其中“4匹配器预期”是指方法调用中的参数数量。错误消息实际上适用于您忘记使用匹配器进行某些参数的情况,例如populateWithParameter(any(), any(), anyString(), 42),这是一个非常常见的错误。

虽然我在评论中看到“它不起作用!”当您尝试返回实例时,我可以保证返回notNull()绝对会导致问题,而返回实例可能只会显示不同的问题。在切换到返回实例后,您可能希望使用完整堆栈跟踪更新问题,或者询问新问题。

有关幕后Mockito匹配器的更多信息,请参阅my question/answer here