Mockito Stub неожиданное поведение - PullRequest
0 голосов
/ 31 августа 2018

Я знаю, что я не должен использовать Mockito таким образом, но я не могу понять, почему этот Mockito код:

public class Demo {

    public static void main(String... args){
        Foo foo = Mockito.mock(Foo.class);
        Mockito.doReturn(-1).when(foo);
        System.out.println(foo.myMethod("a"));
        System.out.println(foo.myMethod("a"));
    }

    public interface Foo{
        int myMethod(Object o);
    }
}

Дает этот результат:

0
-1

Вместо:

0
0

1 Ответ

0 голосов
/ 31 августа 2018

Безопасность типа аргумента отсутствует с doReturn().
Из Mockito.doReturn() Javadoc (ударение не мое):

Используйте doReturn() в тех редких случаях, когда вы не можете использовать when(Object).

Остерегайтесь того, что Mockito.when (объект) всегда рекомендуется для заглушки потому что это аргумент, типобезопасный и более читаемый (особенно когда озвучивание последовательных звонков).

Вы на самом деле не используете when() так, как вам нужно, и поэтому вы получите странный результат, поскольку он разрешающий.

Вы хотите заглушить возвращаемое значение Mock:

Mockito.doReturn(-1).when(foo).myMethod(Mockito.any());

вы не хотите заглушить сам макет:

Mockito.doReturn(-1).when(foo);

Что не имеет смысла: почему ссылка foo должна что-то возвращать?

Или лучше использовать Mockito.when(), который не настолько разрешающий:

Mockito.when(foo).thenReturn(-1); // same oddity will not compile
Mockito.when(foo.myMethod(any())).thenReturn(-1); // but it will compile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...