模拟一个超类构造函数(Mock a superclass constructor)

2019-09-16 23:45发布

我想知道如果我可以模拟一个超类的构造函数调用和其超()调用。

例如,我有以下类

class A
{
    A(..)
    {
        super(..)
    }
}   

class B extends A
{
    B(C c)
    {
        super(c)
    }
}

所以,我打算到单元测试在B类的一些方法,但创建实例时,它调用父类的构造使得它很难编写单元测试。 所以,我怎么能嘲笑所有超类的构造函数调用。 此外,我想嘲笑类的几种方法,使得它作为我需要返回几个值。

谢谢!!

Answer 1:

你可以使用PowerMock库。 这是一个真正的救星,当你需要完成的事情像你。 https://github.com/powermock/powermock/wiki/Suppress-Unwanted-Behavior



Answer 2:

惩戒构造是一个非常糟糕的主意。 这样做是规避行为, 在生产中发生。 这就是为什么在做的工作在构造函数中,如启动线程和调用外部依赖,是一个设计缺陷 。

你能诚实地说,在构造函数中执行的工作对你要测试的行为没有影响? 如果答案是否定的,你运行编写一个测试,将在测试环境中传递的风险,但在生产中失败。 如果答案是肯定的,那就是移动是“工作”的构造函数外一个普通的案件。 另一种方法是将你想考到另一个类的行为(也许它自己)。

如果你使用像吉斯一个DI框架(我假设,因为你标记它的方式),这是更真实的。



Answer 3:

简短的回答你的问题是“不完全是。” 你不能“假”构造,更不用说超。 还嘲讽super.anyMethod是嘲讽框架我所熟悉的困难或不可能。 Powermock 不会让你抑制超级构造函数和方法的问题,这是不完全一样嘲笑他们,但能有所帮助。

当B扩展A,它是完全当然加上A.这本身并不是一个问题,但它可以和它看起来像它在这里。 代替具有乙延伸A的,尝试具有乙含有甲代替(也许在必要时实现相同的接口)。 然后,你可以注入模拟A和委派所有你想要的呼叫。 这将是单元测试更容易,不是吗?

它的测试驱动开发的,你在测试过程中发现设计中的这些东西的好处之一。



文章来源: Mock a superclass constructor