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

在Java中可以扩展没有构造函数的类吗?,java,inheritance,constructor,mocking,Java,Inheritance,Constructor,Mocking,出于单元测试的目的,我试图编写一个没有构造函数的类的实例 这在Java中是可能的吗?当然,类是不可扩展的吗?没有构造函数的类有一个隐式的公共无参数构造函数,是的,只要它不是最终的,它就可以被子类化 如果类只有私有构造函数,那么不可以。如果java类没有任何已定义的构造函数,那么您就没有问题。问题在于类是否定义了任何构造函数,并且所有构造函数都对您不可见(私有)。如果只有私有构造函数,您仍然可以使用反射,以便能够从该类外部访问它们。您可以通过反射更改可见性修饰符 问题已得到回答,但需要添加评论。这

出于单元测试的目的,我试图编写一个没有构造函数的类的实例


这在Java中是可能的吗?当然,类是不可扩展的吗?

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


如果类只有私有构造函数,那么不可以。如果java类没有任何已定义的构造函数,那么您就没有问题。问题在于类是否定义了任何构造函数,并且所有构造函数都对您不可见(私有)。

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

您可以通过反射更改可见性修饰符

问题已得到回答,但需要添加评论。这通常是建议将代码编写成某种程度上可测试的代码的好时机

不要为此感到痛苦,研究它需要什么(至少可能是依赖注入),学习编写模拟,并提出一套合理的指导原则,让类变得更有用

我们不得不重新编写一堆单例来使用DI,因为单例是出了名的难以模仿的


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

是的,您可以模拟对象,尽管可能无法对其进行子类化(无论如何,如果不熟悉类加载器,当然不可能)。就是你如何使用JMock

以这种方式进行模拟允许您保留类型,而无需子类化,尽管可能很难仅挑出某些行为。因此,该方法适用于测试使用该类的类,而不是测试该类本身

如果您确实可以访问该类的源代码,那么您可以实现一个内部类,该类允许您对其进行扩展,尽管如果您可以这样做,您也可以将一个构造函数包设置为私有


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

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

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


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

所讨论的类只有私有构造函数,包括无参数构造函数,所以我想我只是运气不好。看起来那个班在考试方面不是很友好。你真的应该使用接口而不是concrete类型…那么你是在测试单例吗?这总是让人头疼。如果类有接口,那么您可以模拟接口。您还可以围绕最终类创建一个新类,该类实现接口并封装要扩展的最终类的副本。是的,我试图模拟的对象是一个单例对象,它的唯一继承来自对象,没有接口……但这无助于扩展该类。编译器不会让你只使用私有构造函数来扩展一个类。问题是它可以被模拟,而不是可以被子类化,如果答案被接受,也许你应该改变这个问题,如果这是你的意思?我的问题清楚地问到了可扩展性。它只提到模仿是希望获得这种可扩展性的原因。我想要模仿的类是一个我无法控制的Blackberry类。你说得对(假设其中一个是模仿代码,它们可以更改),但这可能应该作为评论而不是回答。我同意,但无法在评论中将文本分成段落常常让我感到沮丧,但这些天(三年后),我想我会做得很好——活到老学到老。