Mockito的when()不存根超类的方法

时间:2019-04-18 21:25:51

标签: java unit-testing junit mockito

我使用未重载的方法doBaseStuff()从'BaseClass'继承了'MyClass':

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的{​​{1}} / 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的实现吗?

1 个答案:

答案 0 :(得分:1)

您想改用@Spy

@Spy
MyClass myClass;

模拟和间谍之间的区别得到了很好的回答here

此外,when().thenReturn()方法将自动执行real方法。仅返回值被替换。如果您不想执行原始方法,请改用doReturn().when()语法:

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