如何使用junit模拟调用singleton类的类

时间:2011-05-01 16:54:30

标签: java unit-testing mocking junit4

我想测试class1调用单例类getInstance的方法:

Class ivDomain {

    public String method1() {

        id=Singleton.getInstance().generateId()

        ... code

    }

}

当我使用Junit进行测试时,我在单例类上得到NullPointerException。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

使用静态访问的单例的类很难测试。将你的ivDomain类更改为单例实例作为参数添加到它的构造函数中,然后正常模拟它。您应该使用依赖注入框架(例如Guice)来使这种开发方式更容易。

答案 1 :(得分:1)

你不应该模拟Singleton;只需更改代码,以便getInstance()不返回null。

答案 2 :(得分:1)

最有可能的原因 - 没有检查你的Singleton的代码 - 它的初始化无法加载一些外部配置,因此失败。

自动单元测试中的单身人士可能是一个问题,因为有时候你喜欢他们对你测试的特定场景有不同的行为(例如你想要一个generateId返回-1的场景,另一个场景返回4354353时另一个场景它会抛出一个RuntimeException - 这样你就可以看到使用Singleton的代码是如何工作的。在这种情况下,建议改变设计,因为Singletons不属于受欢迎的设计模式,有时被视为反模式。

答案 3 :(得分:1)