spring在单元测试中使用application.properties吗?

时间:2018-04-05 08:39:21

标签: java spring-boot junit

我为我的项目使用spring boot。当我运行我的应用程序everthing是可以的,如果我运行我的单元测试(@RunWith(SpringJUnit4ClassRunner)),我得到以下错误。我不知道为什么spring在单元测试中没有使用application.properties(定义了哪些数据源参数)。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:579)
    ... 106 more
Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class
    at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:236)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.initializeDataSourceBuilder(DataSourceProperties.java:176)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:43)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:81)
    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.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    ... 107 more

我的单元测试类是:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Application.class)
public class RepoTest {

    @Autowired IRepo repo;

    @Test
    public void listCards() {
        repo.findCardNo(1L, "00981231231");
    }

}

3 个答案:

答案 0 :(得分:5)

使用@SpringBootTest代替ContextConfiguration SpringBootTest增加了一些魔力,并且还会加载整个配置以及启动应用程序的所有意图和目的。 Context Configuration只会加载一个Spring上下文而不需要很多Spring Boot魔法。

答案 1 :(得分:3)

您可以尝试@TestPropertySource并添加特定文件。这样,您可以为测试和真实应用程序提供不同的属性。

您可以使用@TestPropertySource覆盖application.properties中的值。来自它的javadoc:

测试属性源可用于有选择地覆盖系统和应用程序属性源中定义的属性

例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Application.class)
@TestPropertySource(locations="classpath:test.properties")
public class RepoTest {

对于单元测试,您可能会考虑使用正确的响应来模拟数据库。首先,单元测试将更快地运行。此外,您的单元测试不应该因外部服务(数据库)而失败,因为即使数据库处于脱机状态,代码也能正常工作。

然后,您可以进行一些实际连接到数据库的更复杂的集成测试。

答案 2 :(得分:1)

我认为使用@SpringBootTest对于回购测试来说是多余的。 Spring具有@DatajpaTest用于测试持久层。 它会自动将持久性Bean加载到上下文中,您将在持久性层中将所有内容准备好到@Autowire