我有一个没有重载的方法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);