2009-06-17 124 views
8

对于单元测试目的,我试图编写一个没有构造函数的类的mock object有没有可能扩展一个没有Java构造函数的类?

这甚至在Java中可能的是类根本就没有扩展?

+2

问题是,它可以被嘲笑,不可以被分类,考虑到接受的答案,也许你应该改变这个问题,如果这是你的意思? – Yishai 2009-06-17 14:38:44

+0

我的问题明确询问可扩展性。它只提到嘲笑作为希望这种可扩展性的原因。 – 2009-06-17 18:08:53

回答

18

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

如果类只有私有构造函数则没有,它不能。

+0

有问题的类只有私有构造函数,包括无参数的构造函数,所以我想我只是运气不好。 – 2009-06-17 01:05:13

+0

看起来这个类在测试方面不是非常友好。你真的应该使用接口,而不是concerete类型... – 2009-06-17 01:19:03

2

如果java类没有任何定义的构造函数,那么对你来说没有问题。如果类将定义任何构造函数,并且它们都将隐藏给您(私有),则问题将为此。

0

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

3

已回答问题,但要添加评论。这通常是提出将代码编写为可测试的好时机。

不要做一个关于它的痛苦,研究什么需要(可能是依赖注入至少),了解写作模拟考试,并提出一套合理的指导方针,允许类更有用。

我们只是重新写了一堆单身的使用DI,而不是因为单身是出了名的难嘲笑。

这可能不是一个好,但编码可测性的某种程度是最专业的店标。

3

是的,你可以嘲笑的对象,虽然它可能不能够继承它(当然不是没有得到非常亲密的类加载器,反正)。 Here是你如何使用JMock来完成的。

以这种方式嘲弄可以让你保持的类型,没有子虽然它可能会挺难不可能弄清只有某些行为。因此,此方法适用于测试使用此类的类,而不适用于测试类本身。

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

也有动态语言,这将允许你做的子类,并实现一个Java接口,Java代码可以交互,但我不那么熟悉的细节。

1

您可以模拟类,和其任何或所有构造函数,用JMockit

这是一个Java的嘲弄工具包,它可以让你嘲笑任何事情。 即使该类不公开和/或嵌套,它仍然可以被模拟。 JMockit中有几种机制可用于此目的。工具箱发行版也包含大量的示例JUnit测试。

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

相关问题