考虑以下方法:
public boolean isACertainValue() {
if(context.getValueA() != null && context.getValueA().toBoolean() == true) {
if(context.getType() != null && context.getType() == ContextType.certainType) {
return true;
}
}
return false;
}
我没有写这个代码,它很难看,它完全过于复杂,但我必须使用它。
现在我想测试依赖于对此方法的调用的方法。
我以为我可以通过以下方式解决这个问题:
Mockito.when(spy.isACertainValue()).thenReturn(true);
因为那是我要测试的情况。
但它仍然没有工作,因为它仍在调用方法体:/
我得到了无效指针,或者说我得到了
的内容misusing.WrongTypeOfReturnValue; getValueA()不能返回Boolean。 getValueA()应该返回ValueA
所以我尝试(作为一种解决方法)来做:
Mockito.when(contextMock.getValueA()).thenReturn(new ValueA());
和
Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);
然后我得到一个我似乎无法调试的nullpointer。
那么,在这种情况下如何正确完成?
答案 0 :(得分:21)
当您调用
时Mockito.when(spy.isCertainValue()).thenReturn(true);
此处调用方法isCertainValue()
。这就是Java的工作原理:要评估Mockito.when
的参数,必须评估spy.isCertainValue()
的结果,以便必须调用该方法。
如果您不希望这种情况发生,可以使用the following construct:
Mockito.doReturn(true).when(spy).isCertainValue();
这将具有相同的模拟效果,但不会使用此方法调用该方法。
答案 1 :(得分:0)
此代码是正确的:
Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);
但是你得到了NullPointerException,因为你没有定义应该定义的Mocking值,我使用Spring,在我定义@Autowired
bean的上下文文件中我定义了这个方式:
<bean id="contextMock" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.example.myspringproject.bean.ContextMock" />
</bean>