我实现了一个JUnit 4 TestRule
(扩展一个ExternalResource
),并将它作为一个注入@ClassRule
到我的测试类中:我想在这个类的每个测试中都初始化一个资源,并最终将其拆除。
我的问题是在我的方法之前/之后根本没有调用我的@Before
和规则方法:知道为什么会这样吗?@After
@Test
最小的可编译示例:
package com.acme.test;
import static org.junit.Assert.assertNull;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.ExternalResource;
class Coffee {
public void throwAway() {}
}
class CoffeeMachine extends ExternalResource {
Coffee whatElse;
@Override protected void before() throws Throwable {
whatElse = new Coffee();
}
@Override protected void after() {
whatElse.throwAway();
}
public Coffee gimmieCoffee() { return whatElse; }
}
public class CoffeeTester {
@ClassRule public static CoffeeMachine CM = new CoffeeMachine();
@Test public void drinkACoffee() {
Coffee c = CM.gimmieCoffee();
assertNull(c); // ---> Coffee is null!! (fuuuuuuuuuu...)
}
}
我在这里有什么误解吗?请注意,非静态也会发生同样的情况@Rule
。
我正在使用JUnit 4.11。
非常感谢您的任何提示。