Mockito, когда () не заглушает метод суперкласса - PullRequest
1 голос
/ 19 апреля 2019

У меня есть MyClass, унаследованный от BaseClass с методом doBaseStuff(), который не перегружен:

public class BaseClass {
    public String doBaseStuff(String var1, String var2) {
        //Do something
        return someStringValue;
    }

public class MyClass extends BaseClass {
    public String doMyStuff(String var1, String var2) {
        //Do some stuffs
        doBaseStuff(var1, var2);
        //Do more stuffs
        return someStringValue;
    }
}

Тогда у меня есть контрольный пример для MyClass:

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

    @InjectMocks
    MyClass myClass;

    public void testDoOtherThing() {
        // Some setups
        when(myClass.doBaseStuff(dummyVar1, dummyVar2))
                .thenReturn("This isn't catching the invocation!");

        myClass.doMyStuff(dummyVar1, dummyVar2);

        // Some verify statements
    }
}

Тем не менее, оператор when / then для doBaseStuff() не высмеивает поведение всякий раз, когда вызывается этот метод.

В качестве (очень дерьмового) обходного пути я могу объявить отдельный BaseClass объект как член MyClass:

public class MyClass extends BaseClass {
    private Baseclass baseClass;

    ...

         baseClass.doBaseStuff(var1, var2);

    ...

}

public class MyClassTest {
    @InjectMocks
    MyClass myClass;
    @Mock
    BaseClass baseClass;

    ...

    when(baseClass.doBaseStuff(dummyVar1, dummyVar2))
            .thenReturn("This technically works, but ugh...");

    ...

}

Однако MyClass один из подклассов BaseClass имеет общую функциональность.

Есть ли способ для MyClass макета быть осведомленным о реализации doBaseStuff()?

1 Ответ

1 голос
/ 19 апреля 2019

Вместо этого вы хотите использовать @Spy:

@Spy
MyClass myClass;

О разнице между шуткой и шпионом хорошо сказано здесь .

Также when().thenReturn() Метод будет фактически выполнять реальный метод.Только возвращаемое значение подставляется.Если вы не хотите выполнять оригинальный метод, используйте вместо этого синтаксис doReturn().when():

doReturn("This technically works, but ugh...").when(myClass).doBaseStuff(dummyVar1, dummyVar2);
...