Mockito's when() 不是 stubbing superclass 的方法



我有一个没有重载的方法doBaseStuff()继承了"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
    }
}

但是,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...");
    ...
}

但是,MyClass BaseClass的子类之一共享通用功能。

有没有办法让MyClass模拟了解doBaseStuff()实现?

您想

改用@Spy

@Spy
MyClass myClass;

模拟和间谍之间的区别在这里得到了很好的回答。

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

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

相关内容

  • 没有找到相关文章

最新更新