春季启动测试:@Sql注释无法找到放置在src / test / resources中的sql文件

时间:2019-03-13 14:16:33

标签: java spring spring-boot junit spring-boot-test

我不想为DAO层进行单元测试时加载整个Spring Boot配置,因此创建了一个嵌套配置类来禁止默认配置。但是,当我尝试指定要在测试之前运行的SQL脚本时,它找不到它们。

代码如下:

package com.test.customer.controller;
..
@RunWith(SpringRunner.class)
@JdbcTest
@Sql({"data.sql"})
public class InterviewInformationControllerTest {

    @Configuration
    static class TestConfiguration{

    }

    @Test
    public void testCustomer() {
        // code
    }

}

I get the error: Cannot read SQL script from class path resource [com/test/customer/controller/data.sql]; nested exception is java.io.FileNotFoundException: class path resource [com/test/customer/controller/data.sql] cannot be opened because it does not exist

我尝试将文件放在src/main/resources(不推荐)和src/test/resources(我更喜欢)上

注意:我正在通过执行Run as -> JUnit test从Eclipse内部运行单元测试。

编辑:将static关键字添加到配置类

2 个答案:

答案 0 :(得分:3)

您的内部配置类将无法工作unless you add a static keyword before its definition。但是,您应该知道对于@Sql批注

  

路径资源语义学

     

每个路径将被解释为一个Spring资源。一条简单的道路—为   例如“ schema.sql”-将被视为   是相对于定义测试类的包的。一条路径   以斜杠开头的将被视为绝对类路径   资源,例如:“ / org / example / schema.sql”。一条路径   引用网址(例如,以classpath:,file:,http :、   等)将使用指定的资源协议加载。

因此,尝试像这样在@Sql内为classpath:加上前缀:

@Sql(scripts={"classpath:data.sql"})

祝你好运!

答案 1 :(得分:0)

检查模块的out目录。在资源中创建目录时,如果直接使用com.gakshintala.bookmybook之类的命名空间对其进行命名,则它将完全使用该名称作为目录名称,因此out还在resources下包含该目录,并带有名称com.gakshintala.bookmybook。 PFB是非。顶部是正确的,底部是错误的。

enter image description here enter image description here

Spring总是在寻找嵌套目录资源-> com-> gakshintala-> bookmybook。 因此,请创建该目录结构。