【问题标题】:Spring Config with JUnit temporary folder带有 JUnit 临时文件夹的 Spring Config
【发布时间】:2014-07-23 22:31:45
【问题描述】:

您好,我正在寻找一种在 Spring 配置文件中使用 JUnit 的 TemporaryFolder 的方法。但我收到以下错误。

Caused by: java.lang.IllegalStateException: the temporary folder has not yet been created
   at org.junit.rules.TemporaryFolder.getRoot(TemporaryFolder.java:127)
   at org.junit.rules.TemporaryFolder.newFolder(TemporaryFolder.java:92)
   at org.junit.rules.TemporaryFolder.newFolder(TemporaryFolder.java:84)

这是我的设置

@Configuration
public static class TestConfig {
    @ClassRule
    private final static TemporaryFolder tempFolder = new TemporaryFolder ();   

    @Bean
    public TestBean testBean(){
       return new TestBean(tempFolder.newFolder();
    }

}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestConfig.class})
public SomeTesT{


}

我什至尝试在静态块中初始化 TemporaryFolder,但也没有用。

【问题讨论】:

  • 您可以尝试将@ClassRule 部分移动到SomeTest
  • 我需要TestConfig中的临时文件夹
  • 尝试将私有改为公共,因为@ClassRule 只能理解公共静态字段。

标签: java spring junit junit4 spring-test


【解决方案1】:

在 4.10 之后,你不能像在 JUnit 中那样使用 TemporaryFolder。在 4.10 版之前,TemporaryFolder 可以在没有 @Rule 注释的情况下使用。在 4.10 版中进行了更改,只有两种方法强制执行该更改。在 4.11 版本中,TemporaryFolder 中的所有方法都强制执行此规则。

您的代码中的内容正是:在没有@Rules 的情况下使用 TemporaryFolder。您在@Configuration 类中添加@ClassRule 的事实与JUnit 没有任何关系,JUnit 将无法识别您的注释,因为代码不在JUnit 测试类中。 4.11 版的更改,即this one,使TemporaryFolder 中的所有方法强制使用@Rule 注释。

你有两个选择:

  1. 坚持使用 JUnit 4.10 并按原样使用您的代码
  2. 使用 Junit 4.11,但您的代码需要更改。这是一种方法(将@Configuration 类移动到SomeTest 中):
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration()
public class SomeTest {
    @ClassRule
    public final static TemporaryFolder tempFolder = new TemporaryFolder();

    @Autowired
    private TestBean testBean;

    @Configuration
    static class Config {
        @Bean
        public TestBean testBean() {
            try {
                return new TestBean(tempFolder.newFolder());
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    ...
}

【讨论】:

  • 感谢您指出这一点,但没有更好的解决方案吗? spring 本身是否应该有解决方案?
  • @Zarathustra 我尝试成功地将@ClassRule 字段和@Configuration 静态类放在一个超级抽象类中。至少我可以分解代码的这种平静。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2016-09-12
  • 2018-11-27
  • 1970-01-01
  • 2015-10-06
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多