我实现了一个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...)
}
}
Run Code Online (Sandbox Code Playgroud)
我有什么误解吗?请注意,非静态也会发生同样的情况@Rule.
我正在使用JUnit 4.11.
非常感谢您的任何提示.
我认为这是您的测试运行程序的问题。也许某些插件已经安装了一个自定义运行器,当您从 Ecilpse 运行测试时会使用该运行器?
检查测试的运行配置并确保使用标准 JUnit 4 测试运行程序:

我认为这里没有问题,只是一个误解。首先,让我们阅读assert并it must be稍微更改一下您的代码(很明显您的测试表明c must not be null这给了我们:assertNotNull(c);
我还添加了一些输出,以便向您展示发生了什么。请尝试运行它。
package com.acme.test;
import static org.junit.Assert.assertNotNull;
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();
System.out.println(" ### executing before: " + whatElse);
}
@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();
System.out.println(" ### executing test: " + c);
assertNotNull(c);
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,它给出了以下内容:
### executing before: com.acme.test.Coffee@28f67ac7
[VerboseTestNG] INVOKING: "com.acme.test.CoffeeTester" - com.acme.test.CoffeeTester.drinkACoffee()
### executing test: com.acme.test.Coffee@28f67ac7
[VerboseTestNG] PASSED: "com.acme.test.CoffeeTester" - com.acme.test.CoffeeTester.drinkACoffee() finished in 4 ms
[VerboseTestNG]
[VerboseTestNG] ===============================================
[VerboseTestNG] com.acme.test.CoffeeTester
[VerboseTestNG] Tests run: 1, Failures: 0, Skips: 0
[VerboseTestNG] ===============================================
Run Code Online (Sandbox Code Playgroud)
Soc并不像您期望的那样为 null。
| 归档时间: |
|
| 查看次数: |
1697 次 |
| 最近记录: |