如何使用springboot、Junit5和Mockito模拟HikariDataSource和DataSourceProperties?我找到了一个可能的解决方案,但它似乎是相当冗长的方法来测试单个方法,你可以检查here我正试图对我的类中的一个方法'ping‘进行单元测试,但得到异常:
java.lang.NullPointerException
at com.my.app.configuration.DbConfigurationTest.shouldReturnPing(DbConfgiurationTest.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:532)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:171)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)测试类:
import com.my.app.config.DbConfiguration;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.test.context.TestConfiguration;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.when;
@TestConfiguration
class DbConfigurationTest
{
@InjectMocks static DbConfiguration dbConfiguration;
DataSourceProperties dataSourceProperties= Mockito.mock(DataSourceProperties.class);
@Test
public void shouldReturnPing()
{
// expect
boolean expectedResult = true;
when(dbConfiguration.dataSourceProperties()).thenReturn(dataSourceProperties);
when(dbConfiguration.dataSource(dataSourceProperties).isRunning()).thenReturn(true);
boolean actualResult = dbConfiguration.ping();
assertThat(actualResult, is(equalTo(expectedResult)));
}
}需要测试的方法类:
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
/**
* Database configuration. Only properties override is required, everything else comes from spring boot auto-config.
*/
@Configuration
public class DbConfiguration
{
/**
* Overrides the auto-configured bean in order to specify a different prefix for the DataSourceProperties
*
* @return A DataSourceProperties bean
*/
@Bean
@Primary
@ConfigurationProperties("my.datasource")
public DataSourceProperties dataSourceProperties()
{
return new DataSourceProperties();
}
/**
* Overrides the {@link javax.sql.DataSource} bean creation from
* {@link org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration}
* to specify a different prefix for the {@link org.springframework.boot.context.properties.ConfigurationProperties}
*
* @param dataSourceProperties The properties to configure the datasource
* @return A {@link com.zaxxer.hikari.HikariDataSource} instance
*/
@Bean
@ConfigurationProperties("my.datasource.configuration")
public HikariDataSource dataSource(final DataSourceProperties dataSourceProperties)
{
return dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
/**
* Ping the service.
*
* @return the boolean
*/
public boolean ping()
{
return dataSource(dataSourceProperties()).isRunning();
}
}如何成功测试“ping”方法?我尝试创建mock,但失败了。提前感谢:)
发布于 2021-08-06 11:26:25
我建议将ping()方法移到一个单独的类中,并在那里自动绑定DataSource。例如:
@Component
public class DatabaseHealthCheck {
public DatabaseHealthCheck(HikariDataSource dataSource) {
this.dataSource = dataSource;
}
public boolean ping() {
return dataSource.isRunning();
}
}现在你可以像这样测试它:
// Mock only the DataSource, either with @Mock or like this
HikariDataSource dataSource = mock(HikariDataSource.class);
DatabaseHealthCheck healthCheck = new DatabaseHealthCheck(dataSource);
when(dataSource.isRunning()).thenReturn(true);
assertThat(healthCheck.ping()).isTrue();https://stackoverflow.com/questions/68680310
复制相似问题