Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @未调用TestRule中的Before方法_Java_Junit Rule - Fatal编程技术网

Java @未调用TestRule中的Before方法

Java @未调用TestRule中的Before方法,java,junit-rule,Java,Junit Rule,我实现了一个JUnit4TestRule(扩展了一个ExternalResource),并将其作为一个@ClassRule注入到我的测试类中:我想在这个类的每个测试中一次性初始化一个资源,并最终将其删除 我的问题是我的@Before和@After规则方法在我的@Test方法之前/之后根本没有被调用:知道为什么会发生这种情况吗 最小可编译示例: package com.acme.test; import static org.junit.Assert.assertNull; import org

我实现了一个JUnit4
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...)
    }
}
我有什么误解吗?请注意,非静态
@规则
也会发生同样的情况

我正在使用JUnit4.11


非常感谢您的提示。

我看这里没有问题,只是一个误会。首先,让我们把
assert
理解为
它必须是
,并对代码进行一些更改(很明显,您的测试说
c不能为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
并不像您期望的那样为空。

我认为这是您的测试运行程序的问题。可能某个插件安装了自定义运行程序,当您从Ecilpse运行测试时使用它

检查测试的运行配置,并确保使用了标准JUnit 4测试运行程序:


Before
和Test
不应该在同一个类中吗?我也不确定是否覆盖Before()如果不是这样的标签就足够了……但谢谢Dragondraik。你显然没有尝试过你提供的代码,因为在调用
gimmieCoffee
时有太多的
m
-并且没有导入。我已经解决了这些问题,很好。请提供一个编译和实际演示的示例复制粘贴编译的例子现在已经完成;)@Campa如果你想让别人帮助你的问题,你发布的最小代码应该编译并可以复制。我已经运行了上面的代码,正在调用
before()
after()
。我的
assertNull(c)
行给出了:java.lang.AssertionError:应为null,但为:。我不明白为什么它对你不起作用。在这里运行JUnit4.11和Java7。感谢您的帮助!我得到
###执行test:null
但是:这真的很吸引人:)你尝试过另一个JUnit版本吗?您能提供您拥有的jar的校验和吗?我使用Eclipse附带的JUnit:
org.JUnit_4.11.0.v20130308030/
。校验和是可以的。。我现在尝试使用4.12,我的初始示例运行良好。谢谢@Renat,但是。。404! :我相信Eclipse被广泛使用,所以它不应该有如此明显的问题。我只能建议做一点实验(创建一个新项目,和执行者玩一点),以缩小可能的解释列表。嘿,谢谢你,但我已经检查过了:一切都很正常。