【问题标题】:PowerMockito to test MongoClient SingletonPowerMockito 测试 MongoClient Singleton
【发布时间】:2017-11-26 06:08:44
【问题描述】:

我有一个惰性单例 MongoConnection 类,它带有一个静态方法,它在 MongoConnection.getClient() 上返回 MongoClient 实例:

 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 实现这一目标?

谢谢

【问题讨论】:

    标签: java mongodb junit mockito powermockito


    【解决方案1】:

    以下示例向您展示如何使用 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
        }
    } 
    

    该类已通过以下验证:

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

    顺便说一句:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多