【发布时间】:2015-05-22 14:56:05
【问题描述】:
我实现了一个 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。
非常感谢您的任何提示。
【问题讨论】:
-
@Before不应该与@Test属于同一类吗?我也不确定覆盖before()是否足够,如果它没有被标记 -
不是那样...但是谢谢 Dragondraikk。
-
您显然没有尝试过您提供的代码,因为您在调用
gimmieCoffee时有太多的ms - 并且没有导入。这些东西我都修好了,没问题。请提供一个编译并实际演示问题的示例。 -
复制粘贴编译的例子已经完成;)
-
@Campa 如果您希望人们帮助您解决问题,那么您发布的最小代码确实应该编译并可以复制粘贴。我已经运行了你的代码,就像上面一样,
before()和after()正在被调用。我的assertNull(c)行给出:java.lang.AssertionError: expected null, but was:。我不明白为什么它不适合你。在这里运行 junit 4.11 和 java 7。
标签: java junit-rule