【问题标题】:Does spring use application.properties in unit test?spring 在单元测试中使用 application.properties 吗?
【发布时间】:2018-09-15 00:11:55
【问题描述】:

我在我的项目中使用 Spring Boot。当我运行我的应用程序时,如果我运行单元测试 (@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");
    }

}

【问题讨论】:

  • 尝试使用@SpringBootTest 而不是上下文配置。
  • Spring 确实使用了application.properties,您也可以在测试文件夹中的resources 下定义一个,它会选择它而不是正常的。
  • @DarrenForsy 成功了!谢谢。发布您的答案以供接受。这背后有什么样的魔力?

标签: java spring-boot junit


【解决方案1】:

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

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

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

例如:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我认为使用 @SpringBootTest 对 repo 测试来说太过分了。 Spring 有@DatajpaTest 用于测试持久层。 它会自动将持久性 bean 加载到上下文中,您将在持久层中为@Autowire 准备好一切。

      【讨论】:

        猜你喜欢
        • 2014-11-30
        • 2017-07-16
        • 2016-02-12
        • 1970-01-01
        • 2021-12-25
        • 2015-06-14
        • 1970-01-01
        • 2016-07-23
        • 2017-07-14
        相关资源
        最近更新 更多