我有一个带有main方法的Java类,我调用它偶尔会运行一些测试。具体来说,我正在尝试提出一种解决方案,用于快速测试使用AWS SDK创建/读取某些S3对象的各种代码片段。我并不是真的想要构建常规的单元/集成测试,而且我对模拟S3代码不感兴趣。我正在尝试使用测试框架快速开发/调试一些代码。我发现了以下SO问题,以及关于使用JUnit5 Jupiter的Launcher的答案,它引起了我的兴趣:
How do I run JUnit tests from inside my java application?
因此,我在Launcher
API上阅读the Junit5 chapter并按照示例代码进行操作。我想出了类似的东西:
class S3ManualTest {
public static void main(String[] args) {
LauncherDiscoveryRequest request =
LauncherDiscoveryRequestBuilder
.request()
.selectors(selectPackage("com.xyz.s3util"),
selectClass(S3ManualTest.class),
selectMethod(S3ManualTest.class, "happyPath")
)
.build();
Launcher launcher = LauncherFactory.create();
SummaryGeneratingListener listener = new SummaryGeneratingListener();
launcher.execute(request, listener);
TestExecutionSummary summary = listener.getSummary();
System.out.println("# of containers found: " + summary.getContainersFoundCount());
System.out.println("# of containers skipped: " + summary.getContainersSkippedCount());
System.out.println("# of tests found: " + summary.getTestsFoundCount());
System.out.println("# of tests skipped: " + summary.getTestsSkippedCount());
}
void happyPath() {
assertTrue(true); // Do useful stuff here
}
}
即使我特意选择了“happyPath”方法,启动程序也找不到任何要运行的测试。我尝试使用happyPath()
注释@Test
方法,这似乎有效,但是如果我在gradle中运行该包中的所有测试,它也会产生不希望的副作用。或者从IDE内部。本质上,我希望使用JUnit5框架调用我的测试方法,但只有当我在类中手动运行main方法时。我正在考虑一些自定义注释,或者实现一些可以被测试引擎拾取的接口,但还没有走下去。我猜有一些简单的方法可以完成我想要做的事情。谢谢。
答案 0 :(得分:2)
我只能找到解决方法:默认情况下禁用happyPath()
测试方法并在您的程序中覆盖它,如下所述:https://junit.org/junit5/docs/current/user-guide/#extensions-conditions-deactivation
@Test
@Disabled
void happyPath() {
assertTrue(true); // Do useful stuff here
}
在启动器设置中,停用DisabledCondition
:
LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder
.request()
.selectors(selectMethod(S3ManualTest.class, "happyPath"))
.configurationParameter(
"junit.jupiter.conditions.deactivate",
"org.junit.*DisabledCondition")
.build();
如果您不想在整个运行期间停用DisabledCondition
,也可以指定专用开关:
@Test
@EnabledIf("'true'.equals(junitConfigurationParameter.get('manual'))")
void happyPath() {
assertTrue(true); // Do useful stuff here
}
与
LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder
...
.configurationParameter("manual", "true")
.build();
第二种解决方法,如果应用于多种方法,则会为专用ExecutionCondition
扩展而尖叫。详见https://junit.org/junit5/docs/current/user-guide/#writing-tests-conditional-execution-scripts