是否可以从生产代码访问 JUnit @TempDir-path?

Is it possible to access the JUnit @TempDir-path from production code?

考虑一个 Spring(引导)应用程序,它在调用其服务时将文件生成到输出文件夹。我正在尝试使用 JUnit Jupiter 测试此类功能,但我希望生成的文件在我的测试后被丢弃,这就是我目前正在尝试使用 @TempDir 的原因。它似乎完全符合我的要求,但我正在努力指示我的 Spring 上下文将生成的文件发送到临时目录。

MyService.java

@Service
public class MyService {

    @Value("${myservice.output-directory}")
    private String outputDirectory;

    public void generateOutputFiles() {
        // ...
    }
}

MyServiceTest.java

@SpringBootTest
class MyServiceTest {
    @TempDir
    protected static Path outputDirectory;

    @Autowired
    private MyService myService;

    @Test
    void test1() {
        // ...
    }
}

因此,我的问题是,是否有一种干净的方法可以将 myservice.output-directory 属性 设置为临时目录的绝对路径?

对于这些情况,您可以使用 ReflectionTestUtils。您可以在测试方法中执行,也可以在单元测试中的 @Before 中执行,如果您已经从资源目录配置了 application.yml 中的任何值,这将覆盖。

@SpringBootTest
class MyServiceTest {
    @TempDir
    protected static Path outputDirectory;

    @Autowired
    private MyService myService;

    @Test
    void test1() {
        ReflectionTestUtils.setField(myService, "outputDirectory", outputDirectory);
    }
}