如何在不运行方法的情况下模拟方法调用并返回值?

2022-09-02 03:26:15

请考虑以下方法:

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);因为这就是我想测试的情况。

但它不起作用,因为它仍在调用方法体:/

我得到零点,或者更确切地说,我得到的东西是这样的

滥用。ErrorTypeOfReturnValue;布尔值不能由 getValueA() 返回。getValueA() 应返回 ValueA

所以我尝试(作为一种解决方法)来做:

Mockito.when(contextMock.getValueA()).thenReturn(new ValueA());Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);

但后来我得到了一个空点,我似乎无法调试。

那么,在这种情况下,它是如何做到的呢?


答案 1

调用时

Mockito.when(spy.isCertainValue()).thenReturn(true);

该方法在此处调用。这就是 Java 的工作原理:要计算 的参数,必须计算 的结果,因此必须调用该方法。isCertainValue()Mockito.whenspy.isCertainValue()

如果您不希望发生这种情况,则可以使用以下构造

Mockito.doReturn(true).when(spy).isCertainValue();

这将具有相同的模拟效果,但不会使用此方法调用。


答案 2

此代码是正确的:

Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);

但是你得到NullPointerException是因为你没有定义应该定义的Mocking值,好吧,我正在使用Spring,在我的上下文文件中,当我定义bean时,我是这样定义的:@Autowired

<bean id="contextMock" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.example.myspringproject.bean.ContextMock" />
</bean>

推荐