我有一个从“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...");
...
}
但是,MyClass
的 BaseClass
子类之一共享通用功能。
有没有办法让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/