11

我实现了一个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

非常感谢您的任何提示。

4

2 回答 2

5

我认为这是您的测试运行程序的问题。也许某些插件安装了一个自定义运行程序,当您从 Ecilpse 运行测试时会使用该运行程序?

检查测试的运行配置并确保使用标准的 JUnit 4 测试运行器:

在此处输入图像描述

于 2015-05-19T06:35:19.527 回答
3

我在这里没有看到任何问题,而只是一个误解。首先,让我们阅读assertit 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); 
    }
}

对我来说,它给出了以下内容:

 ### 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] ===============================================

所以c不像你期望的那样为空。

于 2015-05-15T10:52:29.210 回答