Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mock一个超类方法Mockito测试用例_Java_Junit_Mocking_Mockito_Superclass - Fatal编程技术网

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())