JUnit 似乎没有调用我覆盖的 TestWatcher failed/succeeded 方法
JUnit does not seem to be invoking my overridden TestWatcher failed/succeeded methods
注意:MyTest 的代码已更新以反映我找到的答案,这是由 JUnit 生态系统中可用的 assertEquals() 的多个实现引起的。
我在 C 中看到过类似的问题,但没有 answer/responses。我要么在实施上左转,要么忽略了一些简单的事情。所以...
我希望在控制台上看到 "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 之间的向后兼容性。这很好,但它在断言语句上注入了一个有趣的重载。
在我的原始代码中,被调用的方法是 org.junit.framework.TestCase.assertEquals()。然而,这个版本的 assertEquals() 似乎没有调用 TestWatcher.failed() 和 TestWatcher.succeeded()。因此,虽然代码 "ran successfully",但它没有输出所需的日志信息(即 "IT FAILED"/"IT PASSED")。
解决方案是确保断言语句调用正确的实现(即 org.junit.Assert 中的那些)。最简单的方法是修改测试以符合 v4.X 语义(即不扩展 TestCase),然后添加正确的导入语句。
通过对 MyTest 的这些修改,现在一切都按预期工作。我已经更新了原来的 post 以显示修改的位置。
注意:MyTest 的代码已更新以反映我找到的答案,这是由 JUnit 生态系统中可用的 assertEquals() 的多个实现引起的。
我在 C 中看到过类似的问题,但没有 answer/responses。我要么在实施上左转,要么忽略了一些简单的事情。所以...
我希望在控制台上看到 "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 之间的向后兼容性。这很好,但它在断言语句上注入了一个有趣的重载。
在我的原始代码中,被调用的方法是 org.junit.framework.TestCase.assertEquals()。然而,这个版本的 assertEquals() 似乎没有调用 TestWatcher.failed() 和 TestWatcher.succeeded()。因此,虽然代码 "ran successfully",但它没有输出所需的日志信息(即 "IT FAILED"/"IT PASSED")。
解决方案是确保断言语句调用正确的实现(即 org.junit.Assert 中的那些)。最简单的方法是修改测试以符合 v4.X 语义(即不扩展 TestCase),然后添加正确的导入语句。
通过对 MyTest 的这些修改,现在一切都按预期工作。我已经更新了原来的 post 以显示修改的位置。