Java 模拟超类方法调用

Java 模拟超类方法调用,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我想测试一个类,它扩展了一个超类。我使用JUnit和Mockito。在一个方法中,该类调用超类的超级方法: @Override public void init(String input){ super.init(); ... } 现在在我的测试课程中,我已经有了以下设置: @InjectMocks private MyClass classUnderTest = new MyClass(); @Before public void setUp(){ MockitoA

我想测试一个类,它扩展了一个超类。我使用JUnit和Mockito。在一个方法中,该类调用超类的超级方法:

@Override
public void init(String input){
    super.init();
    ...
}
现在在我的测试课程中,我已经有了以下设置:

@InjectMocks
private MyClass classUnderTest = new MyClass();

@Before
public void setUp(){
    MockitoAnnotations.initMocks(this);
}

现在我如何模拟
super.method
调用?我认为间谍活动在这种情况下不会有帮助。

你不应该嘲笑这个电话。你根本不应该在这里继承遗产。如果类
A
需要调用在别处测试的方法
b()
,而您不关心它做什么,这意味着方法
b()
应该在类
b
中,它是类
A
的依赖项,然后您可以执行依赖项注入和模拟
b

如果这是一些您无法更改的遗留代码,重构它的一个有趣策略是在类
a
中创建一个新方法,并在测试中重写它(通过扩展
a
或监视此方法):


我认为mockito的可能复制品在这方面帮不了你——这里也有人问这个问题:非常感谢。但是有可能在同一个类上使用InjectMock和Spy吗?我不知道这两者之间有什么关系。在监视测试对象时,会模拟依赖项。顺便说一句,不建议使用
@InjectMocks
——依赖项不应该在类外可见,也不可能更改它们。好的,那么您建议只使用Spy而不是InjectMocks?让我重复一下-
Spy()
方法和
@InjectMocks
注释是不相关的。前者用于验证/模拟正在测试的对象的方法,后者用于验证被测试对象的协作者/依赖项的方法。
class A extends B {
    private void b() {
        // something here
        super_b();
    }
    protected void super_b() {
        super.b();
    }
}