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

我有一些使用TemporaryFolder @Rule的JUnit测试.他们使用@Before方法中的TemporaryFolder来执行一些设置:
@Rule
public TemporaryFolder folder = new TemporaryFolder();

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

@Test
public void mytest() { ... }

大多数时间这个工作完美.但是,当使用SpringJUnit4ClassRunner时,我发现在某些情况下,init()方法在TemporaryFolder实例中的Statement之前被调用.因此,当init()中使用文件夹时,临时文件夹位置未设置(即:null),我的文件最终在工作目录中,而不是/ tmp.

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

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

解决方法

在JUnit 4.10中,BlockJUnit4ClassRunner(SpringJUnit4ClassRunner的超类)看起来像在任何@Before方法之前运行规则一样来构造Statement链.从JUnit 4.10:
protected Statement methodBlock(FrameworkMethod method) {
    // ...
    Statement statement= methodInvoker(method,test);
    statement= possiblyExpectingExceptions(method,test,statement);
    statement= withPotentialTimeout(method,statement);
    statement= withBefores(method,statement);
    statement= withAfters(method,statement);
    statement= withRules(method,statement);
    return statement;
}

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

Statement statement= methodInvoker(method,test);
statement= possiblyExpectingExceptions(method,statement);
statement= withPotentialTimeout(method,statement);
statement= withRules(method,statement);
statement= withBefores(method,statement);
statement= withAfters(method,statement);
return statement;

spring-test-3.0.5的父POM似乎表明它取决于JUnit 4.7.我不知道是否使用更新的JUnit会有帮助?

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...