在使用@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
答案 0 :(得分:0)
变得足够简单 - 只需更改属性文件中的值即可引用
inputDirectoryLocation=${java.io.tmpdir}/input-test-folder
然后让我的Spock规范在启动Spring之前创建temp文件夹(使用setup()
fixture方法)