java - Mockito 的when() 没有 stub 父类(super class)的方法

标签 java unit-testing junit mockito

我有一个从“BaseClass”继承的“MyClass”,其方法 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
    }
}

但是,每当调用该方法时,doBaseStuff()when/then 语句不会模拟该行为。

作为(非常糟糕的)解决方法,我可以声明一个单独的 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...");

    ...

}

但是,MyClassBaseClass 子类之一共享通用功能。

有没有办法让MyClass模拟知道doBaseStuff()实现?

最佳答案

您想使用@Spy来代替:

@Spy
MyClass myClass;

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

此外,when().thenReturn()方法将实际执行真正的方法。仅替换返回值。如果您不想执行原始方法,请改用 doReturn().when() 语法:

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

关于java - Mockito 的when() 没有 stub 父类(super class)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55753934/

相关文章:

java - 寻找等待时间最短的路径

java - GWT 验证的用户 session

javascript - 如何设置 grunt-contrib-nodeunit 输出 JUnit xml?

javascript - 跨页面加载测试 JavaScript 函数

java - 断言某些参数化 vector 会在 JUnit 中抛出异常?

java - 无法在任何地方调试 Junit 测试

java - 使用 Java 的 JComponent repaint()

java - 我可以在restTemplate.setErrorHandler 中包含restTemplate 请求正文吗?

java - 使用 junit 框架进行 sahi 测试中的 SetUp/TearDown 方法

java - 字符串条件检查测试失败