Подтвердить что ты не робот

Как вымыть вызов метода и вернуть значение без запуска метода?

Рассмотрим следующий метод:

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; GetLalueA() не может возвращать Boolean. getValueA() должен возвращать ValueA

Итак, я попробовал (как обходной путь):

Mockito.when(contextMock.getValueA()).thenReturn(new ValueA()); а также Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);

но затем я получаю нулевой указатель, который, как мне кажется, не способен отлаживать.

Итак, как это делается в этом случае?

4b9b3361

Ответ 1

При вызове

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

здесь вызывается метод isCertainValue(). Так работает Java: для оценки аргумента Mockito.when результат spy.isCertainValue() должен быть оценен, чтобы вызвать метод.

Если вы не хотите, чтобы это произошло, вы можете использовать следующую конструкцию:

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

Это будет иметь тот же издевательский эффект, но метод не будет вызван с этим.

Ответ 2

Этот код верен:

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>