JUnit @Rule与@Before的生命周期交互

tea*_*bot 11 java lifecycle junit rules

我有一些使用的JUnit测试TemporaryFolder @Rule.他们使用TemporaryFolderin @Before方法执行一些设置:

@Rule
public TemporaryFolder folder = new TemporaryFolder();

@Before
public void init() {
  folder.newFile("my-file.txt");
}

@Test
public void myTest() { ... }
Run Code Online (Sandbox Code Playgroud)

大部分时间这都很完美.但是,在使用时SpringJUnit4ClassRunner我发现在某些情况下,在应用内部实例init()之前调用该方法.因此,临时文件夹位置未设置(即:)在内部使用时,我的文件最终在工作目录中,而不是.StatementTemporaryFoldernullfolderinit()/tmp

因此,在某些情况下,@Before方法会在规则之前执行,但是,我无法建立明确的模式.我偶尔会看到一些与我自己的规则实现类似的问题.

有什么方法可以确保在任何设置方法之前应用我的规则语句?

pho*_*ser 12

在JUnit 4.10中,BlockJUnit4ClassRunner(SpringJUnit4ClassRunner的超类)似乎注意构造语句链,使规则在任何@Before方法之前运行.从JUnit 4.10:

protected Statement methodBlock(FrameworkMethod method) {
    // ...
    Statement statement= methodInvoker(method, test);
    statement= possiblyExpectingExceptions(method, test, statement);
    statement= withPotentialTimeout(method, test, statement);
    statement= withBefores(method, test, statement);
    statement= withAfters(method, test, statement);
    statement= withRules(method, test, statement);
    return statement;
}
Run Code Online (Sandbox Code Playgroud)

JUnit 4.7似乎以不同的顺序将Statement链接在一起:

Statement statement= methodInvoker(method, test);
statement= possiblyExpectingExceptions(method, test, statement);
statement= withPotentialTimeout(method, test, statement);
statement= withRules(method, test, statement);
statement= withBefores(method, test, statement);
statement= withAfters(method, test, statement);
return statement;
Run Code Online (Sandbox Code Playgroud)

spring-test-3.0.5的父POM似乎表明它依赖于JUnit 4.7.我想知道如果让它使用更新的JUnit会有帮助吗?