java – JUnit @Rule生命周期与@Before的交互
发布时间:2020-12-14 05:24:34 所属栏目:Java 来源:网络整理
导读:我有一些使用TemporaryFolder @Rule的JUnit测试.他们使用@Before方法中的TemporaryFolder来执行一些设置: @Rulepublic TemporaryFolder folder = new TemporaryFolder();@Beforepublic void init() { folder.newFile("my-file.txt");}@Testpublic void myTe
我有一些使用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会有帮助? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |