Java Mock一个超类方法Mockito测试用例
我有一个这样的结构Java Mock一个超类方法Mockito测试用例,java,junit,mocking,mockito,superclass,Java,Junit,Mocking,Mockito,Superclass,我有一个这样的结构 class A{ public String mymethod(){ //Some processing here } } class B extends A{ public void mySomeMethod(){ String myToken = super.myMethod(); //processing } } 现在我想模拟这里提到的调用字符串myToken=super.myMethod(); 并在我的测试类中返回一个常量
class A{
public String mymethod(){
//Some processing here
}
}
class B extends A{
public void mySomeMethod(){
String myToken = super.myMethod();
//processing
}
}
现在我想模拟这里提到的调用字符串myToken=super.myMethod();
并在我的测试类中返回一个常量字符串。
我试过了
Mockito.doReturn("gdgwdgweg23et287").when((A)bSpy).myMethod();
但这并没有帮助,因为该方法仍在被调用。
有人能在这里建议一种方法吗?首先,你不需要将B的实例转换为A,无论如何转换在这里都不起作用。
然后我的第二个问题是-如何创建bSpy对象 仍在调用real方法的原因是spy只是被间谍对象的包装器。一旦方法调用在包装器边界内,就不涉及包装器(spy)。更重要的是,您不能在被监视对象调用自身的地方存根方法。这是因为调用已经在包装器(spy)边界内
如果在spy上调用
myMethod
,您将得到存根版本。但是如果你在spy上调用mySomeMethod
,这里没有存根,因此它会将调用传递到B
实例,该实例实际上调用了this.myMethod
,你为什么要模仿它呢?如果mymethod
调用了其他依赖项,您能模拟一下吗?单元测试用例的范围应该限制在那个特定的方法上&我正在尝试避免任何外部方法调用。上面的方法试图根据一些逻辑生成一些令牌,这是我的情况&我试图避免这种情况,IMO完全可以。这里的问题不是我是否不感兴趣问题是如何模拟使用super调用的方法,如果这个方法是抽象的,并且它的实现在B类中,我可以很容易地模仿它,但是由于这个方法的实现在不同的类中都很常见,我就这样做了。我建议实用而不是教条。单元测试不应该调用它试图测试的方法以外的任何代码,这种想法在现实中很少有效——您是否希望避免调用String
方法,模拟子字符串
等?如果你真的想继续沿着这条路走下去(我建议你不要走),那么我希望它对你已经发布的代码是可行的——毕竟,这个方法不是final
。如果您能发布一个完整的生产代码和测试示例,这样我们就可以复制它了。bSpy的创建方式类似于Mockito.spy(new B())