如何从测试中预先填充spring属性

时间:2017-06-07 08:23:16

标签: spring spring-boot

在使用@TestPropertySource加载集成测试的弹簧属性时,我遇到了轻微的竞争条件。

考虑以下事项;

测试(使用Spock但JUnit相同)

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource(locations = "classpath:test/simple-test.properties")
class SimpleStuff  extends Specification {

    public static final String inputDirectoryLocation = "/tmp/input-test-folder"

    def "test method"() {
        //do test stuff
    }
}

simple-test.properties

inputDirectoryLocation=/tmp/input-test-folder

Spring Component

@Component
class SpringComponent {

    @Value('${inputDirectoryLocation}')
    String inputDirectory;

//do other stuff
}

以上工作正常但是如何使测试完全隔离并且不依赖于具有文件夹 / tmp / input-test-folder 的FileSystem(因为并非所有用户都运行此测试允许在他们的FS上创建一个/ tmp文件夹

例如,我想使用像

这样的东西
inputDirectoryLocation = Files.createTempDirectory()

这样

@Value('${inputDirectoryLocation}')
String inputDirectory;//equals the output of Files.createTempDirectory()

使用操作系统默认临时文件夹位置&允许我们让测试只是删除清理时的临时文件夹。有没有一个雄辩的解决方案来解决上述问题?

注意:使用Spring boot 1.5

1 个答案:

答案 0 :(得分:0)

变得足够简单 - 只需更改属性文件中的值即可引用

inputDirectoryLocation=${java.io.tmpdir}/input-test-folder

然后让我的Spock规范在启动Spring之前创建temp文件夹(使用setup() fixture方法)