关于单元测试:JUnit java.lang.NoSuchMethodError:junit.framework.ComparisonFailure.getExpected()Ljava / lang / String

JUnit java.lang.NoSuchMethodError: junit.framework.ComparisonFailure.getExpected()Ljava/lang/String

我从之前成功运行的测试用例中获得以下异常,但现在它抛出此异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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运行器的内部问题。


junit.framework.ComparisonFailure上的getExpected()方法仅在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。


如果您正在使用JUnit 4但是从旧的junit.framework包(而不是新的org.junit包)导入Assert类,也会发生这种情况。

检查你的导入和静态导入 - 我的罪魁祸首是import static junit.framework.Assert.assertEquals;


在eclipse中运行我的测试类时,我发生了同样的错误,但我的解决方案略有不同。

我的设置是我在类路径中有junit-4.10 jar,但我的测试类使用的是junit 3,只有在assertEquals方法失败时才会发生异常。

问题是eclipse仍在使用junit 4 runner,所以我通过编辑配置(在eclipse中选择"Run Configuration",然后选择测试类,然后在"JUnit 4"的下拉列表中更改"Test Runner"来更改它)"到"JUnit 3")。


我的问题是junit-4.5.jar直接作为库添加到项目中。

我的解决方案是从Eclipse项目中删除对junit jar的依赖,并依赖于JUnit插件库。可以通过单击项目库屏幕上的"添加库"按钮自动添加或手动添加。

那个从插件中获取JUnit并有一个类似于这样的引用:

1
.../Eclipse/plugins/org.junit_4.12.0.v201504281640

还需要在"顺序和导出"选项卡中将JUnit库移动到列表顶部。选中导出复选框不是必需的。


我也遇到了问题,但那是因为我使用的是JUnit 4.1。我切换到4.4,问题就消失了。


在这种情况下,检查依赖项和导入的库版本是最有效的。

例如,@Test注释可以从org.junit.Test而不是@org.testng.annotations.Test导入。对于Android项目,可能会导致如下错误:

Exception in thread"main" java.lang.NoSuchMethodError: ...


升级到Kepler版本的Eclipse后,我才遇到问题。如果我运行"全部"测试,测试运行正常。但是当我运行单个方法测试时,它会因此错误而失败。

我找到了这个答案,并认为我将在这里分享它以帮助其他人。它的长短是升级到Junit 4.4或更高

https://www.gotraveltech.com/confluence/display/COOK/My+Eclipse向下滚动到"如何在MyEclipse中运行单独的JUnit 4.x.x测试?"