繁体   English   中英

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

[英]How to mock super reference (on super class)?

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

我读过这个问题: 问题

这个答案回答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
    }  
} 

更新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

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

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

更新:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM