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

时间:2014-05-26 08:07:33

标签: java unit-testing mocking super powermock

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

我读过这个问题: question

这回答answer with DI重构代码的建议。但我不能

如果超类方法足够大,这个答案another answer是不合适的。在我的情况下,我有非常大的代码。是的,我知道它是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
    }  
} 

更新2

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

public class Child extends Parent {
    public int save() {
        int i = super.save();
        return i*2;
    }
}

并测试:

@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());
    }
}

输出:198

2 个答案:

答案 0 :(得分:3)

使用Powermock,您可以替换或禁止方法,因此可以更改BaseService.save()完成的操作。您也可以使方法无法抑制。您甚至可以抑制静态初始化程序块。

请阅读this blog entry of the Powermock authors。请参阅"更换"。

更新:

抑制似乎对我有用,但不是替换。见下图: enter image description here

答案 1 :(得分:0)

这是不可能的;超类的全部意义在于它封装了上游状态和功能,并且类层次结构在您的子类中基于extends关系进行了硬编码。