【问题标题】:How to mock super reference (on super class)?如何模拟超级参考(在超级类上)?
【发布时间】:2014-05-26 08:07:33
【问题描述】:

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

我读过这个问题: 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

【问题讨论】:

  • 能否编个代码示例进行测试?这将有助于回答您的问题。
  • @Gábor Lipták 请阅读更新
  • 你能告诉我为什么你的问题不能通过解决方案“DI”的答案来解决吗?你的代码有什么特别的地方吗?
  • 我无法更改此代码

标签: java unit-testing mocking super powermock


【解决方案1】:

使用 Powermock,您可以替换或抑制方法,因此可以更改 BaseService.save() 所做的操作。您还可以使方法对抑制不做任何事情。您甚至可以抑制静态初始化程序块。

请阅读this blog entry of the Powermock authors。请参阅“更换”一章。

更新:

抑制似乎对我有用,但替换不行。见下图:

【讨论】:

  • 关于替换:请注意,这只适用于静态方法!
  • 你可以把super.save放到一个新的方法Childservice.callSuperSave()中,你可以从ChildService.save()中调用ChildService.callSuperSave(),然后你就可以窥探到Childservice,并且您可以抑制或更改 callSuperSave()。当然,您需要更改 ChildService 的代码,
  • 是的,您的建议可以提供帮助,但这不是我想要的。
  • 基类准备好了吗,用Powermockrunner运行测试了吗?
  • 我最初的愿望 - 可以替换超级方法,而不仅仅是抑制,因为有时你会得到 NullPoinerException
【解决方案2】:

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

【讨论】:

  • 现在 Powermock 可以用字节码做出非常困难的事情。我不知道这是否可能。
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多