为什么spring boot不首先在测试资源中使用application.properties?

时间:2017-09-27 06:52:00

标签: spring-boot

我在测试资源目录中有一个特殊的属性文件

└── test
    ├── java
    │   └── com
    │       └── inter3i
    │               ├── dao
    │               │   └── FooMapperTest.java
    └── resources
        └── application.properties

在这个application.properties文件中我指定了MySQL URL。

spring.datasource.url=jdbc:mysql://139.224.xxx.xxx/foo?useSSL=false

然后我执行测试

mvn test -Dtest=com.foo.reportapi.dao.FooMapperTest

但失败了,因为

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:289) ~[spring-jdbc-4.3.10.RELEASE.jar:4.3.10.RELEASE]

但实际上MySQL URK没问题,为什么会出现这个错误?来自wireshark我知道它实际连接到另一个URL

spring.datasource.url=jdbc:mysql://192.168.0.25/foo

application-default.properties

中配置
src
├── main
│   └── resources
│       ├── application-default.properties

那为什么这么违反直觉呢?我认为测试类应首先在测试资源中使用application.properties

另外我必须使用wireshark来查找它所连接的URL,我怎样才能让Spring Boot明确输出MySQL URL信息?

1 个答案:

答案 0 :(得分:1)

正如jonrsharpe已经提到的,特定的配置文件优先于application.properties文件 - 在这里您可以找到PropertySource订单的文档:

most likely a XY problem

您可以通过多种方式修复它:

  1. 将main / resources / application-default.properties重命名为main / resources / application.properties
  2. 将test / resources / application.properties重命名为test / resources / application-default.properties
  3. 将test / resources / application.properties重命名为test / resources / application-default-integrationtest.properties,并在测试类上启用带有以下注释的配置文件:@ActiveProfiles({" integrationtest"})
  4. 我建议#3,因为它不依赖于main和test元素的classpath优先级,并清楚地说明了使用的文件。

    现在到你问题的记录部分。

    如果将弹簧日志级别增加到" debug"你可以看到加载了哪些配置文件。您可以在自己的代码中记录特定属性:

    @Component
    @Slf4j
    public class LogSpringDatasourceUrlProperty {
      @Autowired
      public LogSpringDatasourceUrlProperty(@Value("${spring.datasource.url}") String jdbcUrl){
         log.info( "application uses '{}' as jdbcUrl", jdbcUrl );    
      }
    }