我从之前成功运行的测试用例中获得以下异常,但现在它抛出此异常:
java.lang.NoSuchMethodError: junit.framework.ComparisonFailure.getExpected()Ljava/lang/String;
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestListener.testFailure(JUnit4TestListener.java:63)
at org.junit.runner.notification.RunNotifier$4.notifyListener(RunNotifier.java:100)
at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:41)
at org.junit.runner.notification.RunNotifier.fireTestFailure(RunNotifier.java:97)
at org.junit.internal.runners.JUnit38ClassRunner$OldTestClassAdaptingListener.addError(JUnit38ClassRunner.java:41)
at org.junit.internal.runners.JUnit38ClassRunner$OldTestClassAdaptingListener.addFailure(JUnit38ClassRunner.java:64)
at junit.framework.TestResult.addFailure(TestResult.java:46)
at junit.framework.TestResult.runProtected(TestResult.java:127)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
有谁知道造成这种情况的原因是什么?这似乎是JUnit跑步者的内部问题。
答案 0 :(得分:21)
getExpected()
上的junit.framework.ComparisonFailure
方法仅在JUnit 3.8.2中添加(请记住,junit.framework
包来自JUnit 3.8,而JUnit 4使用org.junit
)。 3.8.1中没有这个方法,这是3.x的最常见版本。
我认为添加该方法是为了更容易迁移到JUnit 4工具,偶尔会在使用JUnit 3.8的旧代码库中弹出此异常。在运行JUnit 3.8测试时,Eclipse JUnit 4测试运行器似乎会切换回调用junit.framework.*
代码。
所以我猜你还有JUnit 3.8.1潜伏在你的类路径上,并且它与Eclipse测试运行器发生了冲突。要么摆脱那个JAR,要么“升级”到3.8.2。
答案 1 :(得分:12)
如果你正在使用JUnit 4但是从旧的Assert
包中导入junit.framework
类(而不是新的org.junit
包),也会发生这种情况
检查您的导入和静态导入 - 我的罪魁祸首是import static junit.framework.Assert.assertEquals;
答案 2 :(得分:7)
在eclipse中运行我的测试类时,我发生了同样的错误,但我的解决方案略有不同。
我的设置是我在类路径中有junit-4.10 jar但我的测试类使用的是junit 3,只有在assertEquals方法失败时才会发生异常。
问题是eclipse仍在使用junit 4 runner,所以我通过编辑配置(在eclipse中选择“Run Configuration”,然后选择测试类,然后在下拉列表中更改“Test Runner”)来更改它“JUnit 4”到“JUnit 3”)。
答案 3 :(得分:3)
我的案例中的问题是junit-4.5.jar直接作为库添加到项目中。
我的解决方案是从Eclipse项目中删除对junit jar的依赖,并依赖于JUnit插件库。那个是自动添加的,或者可以通过单击项目库屏幕上的添加库按钮手动添加。
那个从插件中获取JUnit并且有类似的引用:
.../Eclipse/plugins/org.junit_4.12.0.v201504281640
还需要在“订单和导出”选项卡中将JUnit库移动到列表顶部。选中导出复选框是不必要的。
答案 4 :(得分:1)
我也遇到了问题,但那是因为我使用的是JUnit 4.1。我切换到4.4,问题就消失了。
答案 5 :(得分:0)
升级到Kepler版本的Eclipse后,我才遇到问题。如果我运行“全部”测试,测试运行正常。但是当我运行单个方法测试时,它会因此错误而失败。
我找到了这个答案,并认为我将在这里分享它以帮助其他人。它的长短是升级到Junit 4.4或更高
https://www.gotraveltech.com/confluence/display/COOK/My+Eclipse向下滚动到“如何在MyEclipse中运行单独的JUnit 4.x.x测试?”
答案 6 :(得分:0)
在这种情况下,检查依赖项和导入的库版本效率最高。
例如,@Test
注释可以从org.junit.Test
而不是@org.testng.annotations.Test
导入。对于Android项目,可能会导致如下错误:
线程中的异常" main" java.lang.NoSuchMethodError:...