我使用未重载的方法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
的实现吗?
答案 0 :(得分:1)
您想改用@Spy
:
@Spy
MyClass myClass;
模拟和间谍之间的区别得到了很好的回答here。
此外,when().thenReturn()
方法将自动执行real方法。仅返回值被替换。如果您不想执行原始方法,请改用doReturn().when()
语法:
doReturn("This technically works, but ugh...").when(myClass).doBaseStuff(dummyVar1, dummyVar2);