JUnit5控制台启动器无法找到测试

3
我看到很多关于这个问题的帖子,但是没有一个解决方案适用于我。
问题在于JUnit5控制台启动器似乎无法找到我的测试,无论我尝试什么语法。我已经尝试使用--scan-classpath扫描它们,并使用-c直接指定类,包括包说明符,但都会生成NoClassDefFound错误。
使用--scan-classpath,控制台启动器可以成功运行,但不包括任何单元测试执行 - 某种原因找不到测试类。
树的结构如下:
junit-5-jars  (the console standalone jar is in here) 
src   
   mypackage
     MyClass.java
     MyClass.class 
test   
   mypackage
     MyClassShould.java
     MyClassShould.class

从根本上讲,我尝试了第一个和最基本的命令:

java -jar junit5-jars/junit-platform-console-standalone-1.7.0-all.jar --class-path=test --class-path=src --scan-classpath

我尝试的所有变化都给了我以下结果:

Test run finished after 27 ms
[         2 containers found      ]
[         0 containers skipped    ]
[         2 containers started    ]
[         0 containers aborted    ]
[         2 containers successful ]
[         0 containers failed     ]
[         0 tests found           ]
[         0 tests skipped         ]
[         0 tests started         ]
[         0 tests aborted         ]
[         0 tests successful      ]
[         0 tests failed          ]

这是在Mac上从bash运行的。在一个将所有类文件放在运行命令的根目录的项目中,我可以成功地使用控制台启动器运行测试。但如果类文件位于像此类的子目录中,则无法运行。有人有什么想法吗?(注意-请参见下面的答案,子目录不是问题-测试类名中的“Should”才是问题)。


你试过没有使用“mypackage”后缀吗?此外,如果我没记错的话,“-classpath”是不带中间破折号的拼写。最后,两个classpath组件应该用分号分隔开来。 - johanneslink
是的 - 它被埋在文本中,但我已经尝试过删除 mypackage 并只使用 --class-path test。我认为那其实是正确的方式 - 包不包含在 classpath 条目中。但结果相同 - 找不到测试。根据 JUnit5 ConsoleLauncher 文档,-cp、--classpath 和 --class-path 都是可接受的(我已经尝试了这三个)。请记住,这是传递给 ConsoleLauncher 的 classpath 参数,而不是 java 命令本身。他们的文档在这里:https://junit.org/junit5/docs/current/user-guide/#running-tests-console-launcher - Jim Weaver
1个回答

2

我认为我已经发现了这个问题的根源——测试类名称中的“Should”,JUnit5 ConsoleLauncher默认不会包含它进行扫描。

以下代码是有效的:

java -jar junit5-jars/junit-platform-console-standalone-1.7.0-all.jar --class-path=test:src --include-classname=.* --scan-classpath

include classname选项采用正则表达式,但在我的情况下,我只是让它扫描类路径上的所有文件以查找测试,并且它会按照预期找到它们。

如果--scan-classpath说明文档中提到了include-classname选项和/或它们默认的扫描包含项,那将会很有帮助。在那么多选项中很容易错过这个参数。


如果需要,您可以更改默认的类路径模式。存在模式的原因是类路径扫描是非常昂贵的操作。通过按名称过滤掉大多数类,这是处理成千上万个类时提高性能的关键。 - johanneslink
是的,我现在在“-include-classname=PATTERN”参数中看到了。如果在启动器文档的顶部或“scan-classpath”参数的描述中加入一些说明,说明默认值以及如何更改它,那么就可以节省我的时间了。我只是期望它的工作方式大致类似于IDE、Maven和Gradle通常所做的那样,即不基于测试类名称而是基于注释和/或目录约定来发现测试。 - Jim Weaver
至少在Gradle中,您将看到相同的行为,而不必更改默认模式,以Should结尾的测试不会被执行。 - johanneslink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接