我已经从 JUnit3.8 切换到 JUnit4.4。我使用 ant 运行测试,我的所有测试都成功运行,但测试实用程序类失败并出现“无可运行方法”错误。我使用的模式是在 test 文件夹下包含名称为 *Test* 的所有类。
我知道跑步者找不到任何用 @Test 属性注释的方法。但它们不包含此类注释,因为这些类不是测试。令人惊讶的是,在 eclipse 中运行这些测试时,它并没有抱怨这些类。
在 JUnit3.8 中,这根本不是问题,因为这些实用程序类没有扩展 TestCase,因此运行程序不会尝试执行它们。
我知道我可以在 ant 脚本的 junit 目标中排除这些特定类。但是我不想在我添加的每个新实用程序类上都更改构建文件。我也可以重命名课程(但给课程起好名字一直是我最薄弱的天赋:-))
这个问题有什么优雅的解决方案吗?
使用@Ignore 注释您的实用程序类。这将导致 JUnit 不尝试将它们作为测试运行。
我的具体情况有以下情况。我们的测试
public class VenueResourceContainerTest extends BaseTixContainerTest
全部展开
BaseTixContainerTest
JUnit 试图运行 BaseTixContainerTest。可怜的 BaseTixContainerTest 只是试图设置容器,设置客户端,点一些披萨,然后放松一下……伙计。
如前所述,您可以使用
@Ignore
但这导致 JUnit 将该测试报告为已跳过(而不是完全忽略)。
Tests run: 4, Failures: 0, Errors: 0, Skipped: 1
这让我很恼火。
所以我做了 BaseTixContainerTest 抽象,现在 JUnit 真正忽略了它。
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
@Ignore
好得多
假设您可以控制用于查找测试类的模式,我建议将其更改为匹配 *Test
而不是 *Test*
。这样 TestHelper
不会匹配,但 FooTest
会。
为了防止 JUnit 实例化您的测试基类,只需让它
public abstract class MyTestBaseClass { ... whatever... }
(@Ignore 将其报告为已忽略,我将其保留用于暂时忽略的测试。)
protected abstract class
。
如果这是您的基本测试类,例如 AbstractTest 并且您的所有测试都扩展了它,那么将此类定义为 abstract 如果它是 Util 类,那么最好从类中删除 *Test 重命名为 MyTestUtil 或 Utils 等。
使用 IDE 的代码完成添加 @Test
的导入时要小心。
例如,它必须是 import org.junit.Test
而不是 import org.testng.annotations.Test
。如果你做后者,你会得到“没有可运行的方法”错误。
org.junit.jupiter.api.Test
来搞乱我的想法!但多亏了你,现在解决了
Ant 现在带有 skipNonTests
属性,该属性旨在完全满足您的需求。无需更改基类以对其进行抽象或添加注释。
skipNonTests
属性仅在 ant 1.9+ 中可用,这很遗憾,因为它看起来非常有用。它还将排除抽象测试超类。
给这些类添加一个空的测试方法怎么样?
public void avoidAnnoyingErrorMessageWhenRunningTestsInAnt() {
assertTrue(true); // do nothing;
}
如果在你的测试类中写了 import org.junit.jupiter.api.Test;删除它并写入 import org.junit.Test;在这种情况下,它也对我有用。
@BeforeAll
和 @AfterAll
没有运行。
@BeforeClass
和 @AfterClass
,但 JUnit5 没有。参考:junit.org/junit5/docs/current/user-guide/#migrating-from-junit4
在运行最简单的简单代码(使用@Test、@Before 等)时,我也遇到了类似的问题(“没有可运行的方法……”),但无处可寻。我使用的是 Junit4 和 Eclipse SDK 版本 4.1.2。通过使用最新的 Eclipse SDK 4.2.2 解决了我的问题。我希望这可以帮助那些在类似问题上苦苦挣扎的人。