Sonarqube is saying I don’t have test coverage for the below catch block so
could you suggest me the best way to write a test for both the “try” and the “catch” blocks?
ItemServiceImpl.java:
<code>@Service
@Slf4j
public class ItemsServiceImpl implements ItemService {
@Autowired
private DataSource dataSource;
@Override
public String checkDatabaseConnection() {
DatabaseMetaData metaData;
try (java.sql.Connection connection = dataSource.getConnection()) {
log.debug("Testing connection to database" + ((BasicDataSource) dataSource).getUrl());
metaData = connection.getMetaData();
log.debug("Testing connection to database metadata={}", metaData);
} catch (Exception e) {
log.error("Exception while testing connection to database, Error={}", e.getMessage(), e);
return "Exception while testing connection to database, Error=" + e.getMessage();
}
return null;
}
</code>
<code>@Service
@Slf4j
public class ItemsServiceImpl implements ItemService {
@Autowired
private DataSource dataSource;
@Override
public String checkDatabaseConnection() {
DatabaseMetaData metaData;
try (java.sql.Connection connection = dataSource.getConnection()) {
log.debug("Testing connection to database" + ((BasicDataSource) dataSource).getUrl());
metaData = connection.getMetaData();
log.debug("Testing connection to database metadata={}", metaData);
} catch (Exception e) {
log.error("Exception while testing connection to database, Error={}", e.getMessage(), e);
return "Exception while testing connection to database, Error=" + e.getMessage();
}
return null;
}
</code>
@Service
@Slf4j
public class ItemsServiceImpl implements ItemService {
@Autowired
private DataSource dataSource;
@Override
public String checkDatabaseConnection() {
DatabaseMetaData metaData;
try (java.sql.Connection connection = dataSource.getConnection()) {
log.debug("Testing connection to database" + ((BasicDataSource) dataSource).getUrl());
metaData = connection.getMetaData();
log.debug("Testing connection to database metadata={}", metaData);
} catch (Exception e) {
log.error("Exception while testing connection to database, Error={}", e.getMessage(), e);
return "Exception while testing connection to database, Error=" + e.getMessage();
}
return null;
}
TestItemServiceImpl.java:
<code> @SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {Application.class})
@ContextConfiguration(classes = {ItemsServiceImpl.class, DbTestConfig.class})
public class TestMessageInjectionServiceImpl {
@Autowired
private ItemsServiceImpl itemService;
@Test
@ContextConfiguration(classes = {DbExceptionTestConfig.class})
public void testCheckDatabaseConnection_Exception() {
String result = itemService.checkDatabaseConnection();
assertNotNull(result);
assertTrue(result.contains("Exception while testing connection to database"));
}
@Test
public void testCheckDatabaseConnection_Ok() {
String result = messageInjectionService.checkDatabaseConnection();
assertNull(result);
}
}
</code>
<code> @SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {Application.class})
@ContextConfiguration(classes = {ItemsServiceImpl.class, DbTestConfig.class})
public class TestMessageInjectionServiceImpl {
@Autowired
private ItemsServiceImpl itemService;
@Test
@ContextConfiguration(classes = {DbExceptionTestConfig.class})
public void testCheckDatabaseConnection_Exception() {
String result = itemService.checkDatabaseConnection();
assertNotNull(result);
assertTrue(result.contains("Exception while testing connection to database"));
}
@Test
public void testCheckDatabaseConnection_Ok() {
String result = messageInjectionService.checkDatabaseConnection();
assertNull(result);
}
}
</code>
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {Application.class})
@ContextConfiguration(classes = {ItemsServiceImpl.class, DbTestConfig.class})
public class TestMessageInjectionServiceImpl {
@Autowired
private ItemsServiceImpl itemService;
@Test
@ContextConfiguration(classes = {DbExceptionTestConfig.class})
public void testCheckDatabaseConnection_Exception() {
String result = itemService.checkDatabaseConnection();
assertNotNull(result);
assertTrue(result.contains("Exception while testing connection to database"));
}
@Test
public void testCheckDatabaseConnection_Ok() {
String result = messageInjectionService.checkDatabaseConnection();
assertNull(result);
}
}
I tried this approach but :
- I can’t use @ContextConfiguration on a single test only on the whole class, I get a compile error
- reading around, using @ContextConfiguration seems a very expensive and slowing thing to do usually used for Integration testing, so is there a better approach for writing fast and easy unit tests ?
2