java - JUnit 似乎没有调用我重写的 TestWatcher 失败/成功方法

标签 java junit junit4 junit-rule

注意:MyTest 的代码已更新以反射(reflect)我找到的答案,这是由 JUnit 生态系统中可用的 assertEquals() 的多个实现引起的。

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

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

TestRunner 实现

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);
    }
}

测试实现

// 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 实现

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 之间的向后兼容性。这很好,但它在断言语句上注入(inject)了一个有趣的重载。

在我的原始代码中,被调用的方法是 org.junit.framework.TestCase.assertEquals()。然而,这个版本的assertEquals()似乎没有调用TestWatcher.failed()和TestWatcher.succeeded()。因此,虽然代码“成功运行”,但它没有输出所需的日志记录信息(即“IT FAILED”/“IT PASSED”)。

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

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

关于java - JUnit 似乎没有调用我重写的 TestWatcher 失败/成功方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40314256/

相关文章:

java - ExpectedException.expectMessage((String) null) 不工作

java - 将参数从测试套件发送到 junit 4 中的测试用例

java - 模拟一个类与模拟它的接口(interface)

java - 如何跳过测试而不失败

java - RequestMapping 占位符在 JUnit 测试中不起作用

junit4 - JUnit 4 : how do I create a suite of suites?

java - JsonIgnore 不适用于 Spring

java - 对 OnBackPressed 感到困惑

java - Jackson 没有正确解析时间戳

java - 实现 AdMob 后出现问题