PowerMockito 测试 MongoClient 单例

PowerMockito to test MongoClient Singleton

我有一个懒惰的单例 MongoConnection class 和一个静态方法 returns 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 文档)。

注意:我不想在测试中连接到实际的数据库,因为它将是集成测试而不是 JUnit;我只想确定 MongoClient 是否使用预期参数进行了初始化。如何使用 PockerMockito 实现此目的?

谢谢

以下示例向您展示如何使用 Mockito 和 PowerMockito 来模拟您的 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
    }
} 

此 class 已验证:

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

顺便说一句,这个:

i don't have choice over singleton because there will be single instance of MongoClient across the application(as per MongoDB documentation).

... 不要求您将 MongoClient 设为静态。您可以使 getClient() 成为非静态方法并确保 MongoConnection 是单例,即您的应用程序只有它的单个实例。依赖注入解决方案(例如 Spring、Guice)内置支持确保可以将依赖项配置为单例。