是否可以在Java中扩展没有构造函数的类?

时间:2009-06-17 00:25:01

标签: java inheritance constructor mocking

对于单元测试目的,我正在尝试编写一个没有构造函数的类的mock object

这在Java中是否可行,是否该类根本无法扩展?

7 个答案:

答案 0 :(得分:18)

没有构造函数的类有一个隐式的公共无参构造函数,是的,只要它不是最终的,它就可以是子类。

如果该类只有私有构造函数,那么它不能,它不能。

答案 1 :(得分:3)

问题已得到解答,但要添加评论。这通常是建议编写代码有点可测试的好时机。

不要痛苦,研究它需要什么(至少可能是Dependency Injection),学习编写模拟并提出一套合理的指导方针,使类更有用。

我们不得不重新编写一堆单身人士来使用DI,因为单身人士很难嘲笑。

这可能不会很好,但在大多数专业商店中,某些级别的可测试性编码是标准的。

答案 2 :(得分:3)

是的,你可以模拟对象,虽然它可能无法对它进行子类化(当然不是没有与类加载器非常亲密)。 Here就是你用JMock做的。

以这种方式进行模拟可以让你保持类型,而无需继承子类,虽然很可能很难不能只梳理出某些行为。因此,此方法适用于测试使用此类的类,而不是测试类本身。

如果你实际上可以访问类的源代码,你可以实现一个允许你扩展它的内部类,尽管你可以这样做,你也可以让其中一个构造函数包也是私有的。 / p>

还有动态语言可以让你进行子类化,并实现Java代码可以与之交互的Java接口,但我对这些细节并不熟悉。

答案 3 :(得分:2)

如果java类没有任何已定义的构造函数,那么对您来说没有问题。问题是如果类将定义任何构造函数,并且所有构造函数对您来说都是不可见的(私有)。

答案 4 :(得分:2)

您可以通过反射更改可见性修改器。 Here is an article listing how

答案 5 :(得分:1)

您可以使用JMockit模拟该类及其任何或所有构造函数。

这是一个Java的模拟工具包,可以让你模拟任何东西。 即使该类是非公共的和/或嵌套的,它仍然可以被模拟。 JMockit中有几种可用于此的机制。工具包分发包含许多示例JUnit测试。

如果类实现某个接口或扩展抽象类,您可以告诉JMockit根据需要“捕获”和模拟基类型的实现,因为它们由JVM加载,甚至可以将创建的实例分配给字段在测试课上。

答案 6 :(得分:0)

如果只有私有构造函数,您仍然可以使用反射,以便能够从该类外部访问它们。