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)内置支持确保可以将依赖项配置为单例。
我有一个懒惰的单例 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)内置支持确保可以将依赖项配置为单例。