Please refere below code snipped
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.bson.UuidRepresentation;
import org.jobrunr.storage.StorageProvider;
import org.jobrunr.storage.nosql.documentdb.AmazonDocumentDBStorageProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfig {
@Value("${mongodb.host}")
private String mongoHost;
@Value("${mongodb.username}")
private String username;
@Value("${mongodb.password}")
private String password;
@Bean
public StorageProvider getStorageProvider() {
return getAmazonDocumentDB();
}
private AmazonDocumentDBStorageProvider getAmazonDocumentDB() {
ConnectionString connectionString = new ConnectionString(getAmazonDocumentDbConnectionString());
MongoClientSettings.builder().applyConnectionString(connectionString);
final MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.uuidRepresentation(UuidRepresentation.JAVA_LEGACY)
.build();
final MongoClient mongoClient = MongoClients.create(mongoClientSettings);
return new AmazonDocumentDBStorageProvider(mongoClient);
}
private String getAmazonDocumentDbConnectionString() {
final String template = "mongodb://%s:%s@%s/?replicaSet=rs0&readpreference=%s&retryWrites=false";
final String username = this.username;
final String password = this.password;
final String host = this.mongoHost;
final String readPreference = "secondaryPreferred";
return String.format(template, username, password, host, readPreference);
}
}
I want to write unit tests for the above Configuration to pass sonar test in pipeline(95% coverage is required) But I am unable to mock mongoDb.
Below is the code written for unit test
@ExtendWith({MockitoExtension.class})
public class BeanConfigTest {
@InjectMocks
private BeanConfig beanConfig;
@Value("${mongodb.host}")
private String mongoHost = "localhost:27017";
@Value("${mongodb.username}")
private String username = "user";
@Value("${mongodb.password}")
private String password = "pass";
;
private static MockedStatic<MongoClientSettings> mongoClientSettings = Mockito.mockStatic(MongoClientSettings.class);
private static MockedStatic<MongoClients> mongoClients = Mockito.mockStatic(MongoClients.class);
private static MongoClient mockMongoClient = Mockito.mock(MongoClient.class);
@InjectMocks
private ActionHandler actionHandler;
@Mock
private StorageService storageService;
@BeforeAll
public static void init(){
mongoClients.when(() -> MongoClients.create(any(MongoClientSettings.class))).thenReturn(mockMongoClient);
}
@Test
public void testActionHandler() {
StorageProvider storageProvider = beanConfig.getStorageProvider();
assertNotNull(storageProvider);
}
Getting below error
java.lang.NullPointerException: Cannot invoke "com.mongodb.client.MongoDatabase.getCollection(String)" because "this.jobrunrDatabase" is null
at org.jobrunr.storage.nosql.mongo.MongoDBCreator.<init>(MongoDBCreator.java:49)
at org.jobrunr.storage.nosql.mongo.MongoDBCreator.<init>(MongoDBCreator.java:42)
at org.jobrunr.storage.nosql.documentdb.AmazonDocumentDBStorageProvider.runMigrations(AmazonDocumentDBStorageProvider.java:59)
at org.jobrunr.storage.nosql.mongo.MongoDBStorageProvider.setUpStorageProvider(MongoDBStorageProvider.java:145)
at org.jobrunr.storage.nosql.mongo.MongoDBStorageProvider.<init>(MongoDBStorageProvider.java:126)
at org.jobrunr.storage.nosql.mongo.MongoDBStorageProvider.<init>(MongoDBStorageProvider.java:111)
at org.jobrunr.storage.nosql.mongo.MongoDBStorageProvider.<init>(MongoDBStorageProvider.java:91)
at org.jobrunr.storage.nosql.documentdb.AmazonDocumentDBStorageProvider.<init>(AmazonDocumentDBStorageProvider.java:26)
at com.cs.config.BeanConfig.getAmazonDocumentDB(BeanConfig.java:39)
at com.cs.config.BeanConfig.getStorageProvider(BeanConfig.java:28)
at com.cs.config.BeanConfigTest.testActionHandler(BeanConfigTest.java:87)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
please guide me How to write unit tests for the COnfiguration Class mentioned above.
Trying to write unit tests, but unable to mock mongo and jobrunr dependencies.
New contributor
Sachin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
2