如何模拟超级引用(在超级类上)?

gst*_*low 5 java unit-testing mocking super powermock

有时,当我编写单元测试时,我应该模拟对超类的引用。

我已经阅读了这个问题: 问题

这个答案回答了重构代码的DI建议。但我做不到

如果超类方法足够大,这个答案另一个答案不合适。就我而言,我有非常大的代码。是的,我知道这违反了 SOLID OOD 原则,但我应该编写测试。我没有足够的时间进行重构。

这个问题是 4 年前提出的!

目前 Mockito 或 Powermock 可以解决这个问题吗?

更新

代码示例:

class BaseService {  
    public void save() {
      // a lot of code here! I cannot change this code.
    }  
}

public Childservice extends BaseService {  
    public void save(){  
        //logic for testing
        super.save();
       //logic for testing
    }  
} 
Run Code Online (Sandbox Code Playgroud)

更新 2

public class Parent {
    public int save() {
         return 99;
    }   
}

public class Child extends Parent {
    public int save() {
        int i = super.save();
        return i*2;
    }
}
Run Code Online (Sandbox Code Playgroud)

并测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Parent.class)
public class ParentTest {
    @Test
    public void testSave() {       
        PowerMockito.suppress(PowerMockito.methodsDeclaredIn(Parent.class));        
        System.out.println(new Child().save());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:198

Gáb*_*ták 3

使用 Powermock,您可以替换或抑制方法,因此可以更改BaseService.save(). 您还可以创建不执行任何抑制操作的方法。您甚至可以抑制静态初始化块。

请阅读Powermock 作者的这篇博客文章。请参阅“更换”一章。

更新:

抑制似乎对我有用,但替换不行。见下图: 在此输入图像描述