首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何模拟HikariDataSource和DataSourceProperties?

如何模拟HikariDataSource和DataSourceProperties?
EN

Stack Overflow用户
提问于 2021-08-06 10:45:22
回答 1查看 338关注 0票数 0

如何使用springboot、Junit5和Mockito模拟HikariDataSource和DataSourceProperties?我找到了一个可能的解决方案,但它似乎是相当冗长的方法来测试单个方法,你可以检查here我正试图对我的类中的一个方法'ping‘进行单元测试,但得到异常:

代码语言:javascript
运行
复制
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)

测试类:

代码语言:javascript
运行
复制
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)));
    }


}

需要测试的方法类:

代码语言:javascript
运行
复制
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,但失败了。提前感谢:)

EN

回答 1

Stack Overflow用户

发布于 2021-08-06 11:26:25

我建议将ping()方法移到一个单独的类中,并在那里自动绑定DataSource。例如:

代码语言:javascript
运行
复制
@Component
public class DatabaseHealthCheck {
    public DatabaseHealthCheck(HikariDataSource dataSource) {
        this.dataSource = dataSource;
    }

    public boolean ping() {
        return dataSource.isRunning();
    }
}

现在你可以像这样测试它:

代码语言:javascript
运行
复制
// 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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68680310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档