我有一些使用TemporaryFolder
@Rule
的JUnit测试。他们使用TemporaryFolder
方法中的@Before
来执行某些设置:
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Before
public void init() {
folder.newFile("my-file.txt");
}
@Test
public void myTest() { ... }
大部分时间这都很完美。但是,在使用SpringJUnit4ClassRunner
时,我发现在某些情况下,在应用init()
实例中的Statement
之前调用TemporaryFolder
方法。因此,在null
内使用folder
并且我的文件最终在工作目录中而不是init()
时,临时文件夹位置未设置(即:/tmp
)。
因此,在某些情况下,@Before
方法会在规则之前执行,但是,我无法建立明确的模式。我偶尔会看到一些与我自己的规则实现类似的问题。
有什么方法可以确保在任何设置方法之前应用我的规则语句?
答案 0 :(得分: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;
}
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;
spring-test-3.0.5的父POM似乎表明它依赖于JUnit 4.7。我想知道是否让它使用更新的JUnit会有帮助吗?
答案 1 :(得分:0)
对于它的价值,我使用以下作为快速解决方法:
@Rule
public TemporaryFolder tmpFolder = new TemporaryFolder() {
@Override
protected void before() throws Throwable {
if (getRoot() == null) {
super.before();
}
}
@Override
public File newFile(String fileName) throws IOException {
try {
before();
}
catch (Throwable t) {
throw new RuntimeException(t.getMessage(), t);
}
return super.newFile(fileName);
}
@Override
public File newFolder(String folderName) {
try {
before();
}
catch (Throwable t) {
throw new RuntimeException(t.getMessage(), t);
}
return super.newFolder(folderName);
}
};
这可确保正确初始化TemporaryFolder
,无论@Before
方法是在规则之前还是之后运行。