Java 莫基托';s when()不是';t stubing超类';s法
我让“MyClass”继承自“BaseClass”,其方法Java 莫基托';s when()不是';t stubing超类';s法,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我让“MyClass”继承自“BaseClass”,其方法doBaseStuff()没有重载: public class BaseClass { public String doBaseStuff(String var1, String var2) { //Do something return someStringValue; } public class MyClass extends BaseClass { public Strin
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
}
}
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...");
...
}
但是,当
/时,doBaseStuff()
的
语句不会在调用该方法时模仿该行为
作为一种(非常糟糕的)解决方法,我可以将一个单独的BaseClass
对象声明为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
}
}
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
基类的子类之一具有相同的功能
MyClass
mock有没有办法知道doBaseStuff()
实现?您想改用@Spy
:
@Spy
MyClass MyClass;
嘲笑者和间谍之间的区别得到了很好的回答
另外,when().thenReturn()
方法将实际执行real方法。只替换返回值。如果不想执行原始方法,请改用doReturn()。when()
语法:
doReturn("This technically works, but ugh...").when(myClass).doBaseStuff(dummyVar1, dummyVar2);
myClass
的可能重复项不是模拟项,因此不能存根其方法。