Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 JUnit似乎没有调用重写的TestWatcher failed/Successed方法_Java_Junit_Junit4_Junit Rule - Fatal编程技术网

Java JUnit似乎没有调用重写的TestWatcher failed/Successed方法

Java JUnit似乎没有调用重写的TestWatcher failed/Successed方法,java,junit,junit4,junit-rule,Java,Junit,Junit4,Junit Rule,注意:MyTest的代码已经更新,以反映我找到的答案,这是由于JUnit生态系统中提供了多个assertEquals()实现造成的。 我在C中看到过类似的问题,但没有回答。我要么在实现上左转,要么忽略了一些简单的事情。所以 我希望在控制台上看到“IT FAILED”和“IT PASSED”,但没有乐趣。只有“testFailure()”和“testSuccess()”输出 TestRunner impl import junit.runner.Version; // added to suppo

注意:MyTest的代码已经更新,以反映我找到的答案,这是由于JUnit生态系统中提供了多个assertEquals()实现造成的。

我在C中看到过类似的问题,但没有回答。我要么在实现上左转,要么忽略了一些简单的事情。所以

我希望在控制台上看到“IT FAILED”和“IT PASSED”,但没有乐趣。只有“testFailure()”和“testSuccess()”输出

TestRunner impl

import junit.runner.Version; // added to support version check
import org.junit.runner.JUnitCore;

public class TestRunner {
    public static void main(String[] args) {
        System.out.println(Version.id()); // added to check JUnit version
        JUnitCore.runClasses(MyTest.class);
    }
}
测试impl

// NO LONGER NEDED (v3 -v- v4) import junit.framework.TestCase;
import org.junit.Rule;
import org.junit.Test;
import ort.junit.Assert.assertEquals; // version that invokes TestWatcher

// public class MyTest extends TestCase {  // JUnit v3.X semantics 
public class MyTest {                      // JUnit v4.X semantics

    @Rule
    public MyTestWatcher myTestWatcher = new MyTestWatcher();

    @Test
    public void testFailure() {
        System.out.println("testFailure()");
        assertEquals("failure", true, false);
    }

    @Test
    public void testSuccess() {
        System.out.println("testSuccess()");
        assertEquals("failure", true, true);
    }
}
TestWatcher impl

import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

public class MyTestWatcher extends TestWatcher {

    public MyTestWatcher() {}

    @Override
    protected void failed(Throwable e, Description description) {
        System.out.println("IT FAILED");
    }

    @Override
    protected void succeeded(Description description) {
        System.out.println("IT PASSED");
    }
}

根本原因是JUnit v3.X和JUnit v4.X之间的向后兼容性。这很好,但它在断言语句中注入了一个有趣的重载

在我的原始代码中,调用的方法是org.junit.framework.TestCase.assertEquals()。但是,此版本的assertEquals()似乎没有调用TestWatcher.failed()和TestWatcher.succeed()。因此,虽然代码“成功运行”,但它没有输出所需的日志信息(即“失败”/“通过”)

解决方案是确保assert语句调用正确的实现(即org.junit.assert中的实现)。最简单的方法是修改测试以符合v4.X语义(即不扩展TestCase),然后添加正确的导入语句


通过对MyTest的这些修改,现在一切都按预期工作。我已经更新了我的原始帖子,以显示修改的位置。

您没有按照Javadoc正确使用
TestWatcher
:我只是复制和粘贴,这里一切正常。尝试清理旧jar文件并重建所有内容。“您没有按照Javadoc正确使用TestWatcher…”似乎与“我只是复制和粘贴,一切正常…”相去甚远。但是,至少我现在知道代码应该产生预期的结果,并且可以专注于我的环境,而不是代码本身。“我只是复制和粘贴,这里一切都很好”——我真的想知道这意味着什么。是否输出“IT FAILED”和“IT PASSED”语句?或者,代码运行到完成时是否只有“testFailure()”和“testSuccess()”两个输出?我修改了TestRunner以内联一个版本检查(参见原始文章),它显示了v4.12。