PowerMockito测试MongoClient Singleton

时间:2017-11-26 06:08:44

标签: java mongodb junit mockito powermockito

我有一个懒惰的单一MongoConnection类,其中一个静态方法在MongoClient上返回MongoConnection.getClient()个实例:

 public class MongoConnection {

    private static MongoClient mongoclient;

    private MongoConnection() {

    }

    public static MongoClient getClient() {
        if (mongoclient == null) {
            // code to initialize MongoClient
        }
        return mongoclient;
    }
}

如何使用PowerMockito模拟MongoConnection单例并测试getClient方法。

我没有选择单例,因为整个应用程序中会有单个MongoClient实例(根据MongoDB文档)。

注意:我不想在测试中连接到实际的DB,因为它将是集成测试而不是JUnit;我只想确保使用预期参数初始化MongoClient。如何使用PockerMockito实现这一目标?

谢谢

1 个答案:

答案 0 :(得分:1)

以下示例显示如何使用Mockito和PowerMockito来模拟css

animation

此课程经过验证:

  • Mockito v2.7.19
  • PowerMock v1.7.0
  • JUnit v4.12

顺便说一下,这个:

  

我没有选择单例,因为整个应用程序中会有单个MongoClient实例(根据MongoDB文档)。

...并不强制要求您MongoConnection.getMongoClient()静态。您可以使@RunWith(PowerMockRunner.class) @PrepareForTest({MongoConnection.class}) public class ATest { @Test public void aTestWhichRequiresMockingMongoConnection() { MongoClient mongoClient = Mockito.mock(MongoClient.class); PowerMockito.mockStatic(MongoConnection.class); Mockito.when(MongoConnection.getClient()).thenReturn(mongoClient); // set up some expectations on the mocked MongoClient returned by MongoConnection Mockito.when(mongoClient.getDatabase("aDatabaseName")).thenReturn(...); // ... etc } } 成为非静态方法,并确保MongoClient是单例,即您的应用程序只有单个实例。依赖注入解决方案(例如Spring,Guice)具有内置支持,可确保将依赖关系配置为单例。