有条件地跳过JUnit5测试

有条件地跳过JUnit5测试,junit,Junit,在我的JUnitJupiter API 5.5测试中,我正在调用我的方法,该方法在内部对远程服务进行HTTP调用。 现在远程服务可能已关闭或行为不正确。我想跳过测试,以防远程服务无法正常运行 @Test void testMe() { // do something Result res1 = myObject.retrieveResults(params) // assert something Result res2 = myObject.retrieveResults(p

在我的JUnitJupiter API 5.5测试中,我正在调用我的方法,该方法在内部对远程服务进行HTTP调用。 现在远程服务可能已关闭或行为不正确。我想跳过测试,以防远程服务无法正常运行

@Test
void testMe() {
  // do something
  Result res1 = myObject.retrieveResults(params)
  // assert something

  Result res2 = myObject.retrieveResults(param2)
  //asert on results
}

Result retrieveResults(Parameters param) {
 // do something
  // call to remote service
  // if they do not give result throw CustomException()
  // return Result
}

所以基本上在我的测试中,我想检查
myObject.retrieveResult
是否抛出CustomException,然后跳过该测试,否则正常计算

在JUnit 5中,我们有两种不同的方法来完成此任务

出于演示目的,我创建了一个基本类,用于向url发送请求 作为参数传递给它的
调用(字符串url)
方法和 根据请求结果返回
true
false
。 方法的主体在这里是不相关的

使用
假设.assumeTrue()/assumeFalse()
方法
假设
类为我们提供了两个重载方法-
假设真
假设为false
。这个想法是,如果假设是错误的,测试将被跳过

所以,测试是这样的

@测试
void call1(){
假设为真(新的EndpointChecker(),“端点不可用”);
assertTrue(HttpCaller.call(“https://www.google.com"));
}
以下是
EndpointChecker
类的代码

静态类EndpointChecker实现BooleanSupplier{
@凌驾
公共布尔getAsBoolean(){
//在此处检查端点并返回true或false
返回false;
}
}
当测试运行时,将首先检查端点的可用性,如果已启动,则测试将运行

使用JUnit5扩展机制。 那么,让我们从创建注释开始。这很简单

@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(EndpointAvailabilityCondition.class)
public@interface skipwhenEndpoint不可用{
字符串uri();
}
EndpointAvailabilityCondition
class。尽管它看起来很大,但总体逻辑非常简单

import static org.junit.platform.commons.util.AnnotationUtils.findAnnotation;
公共类EndpointAvailabilityCondition实现ExecutionCondition{
@凌驾
公共条件EvaluationResult evaluateExecutionCondition(扩展上下文上下文){
final var optional=findAnnotation(context.getElement(),SkipWhenEndpointUnavailable.class);
if(可选的.isPresent()){
final SkipWhenEndpointUnavailable annotation=可选。get();
最后一个字符串uri=annotation.uri();
//检查这里的连接开始
布尔结果=false;//伪值
//检查此处的连接结束
如果(结果){
返回ConditionEvaluationResult.enabled(“连接已启动”);
}否则{
返回ConditionEvaluationResult.disabled(“连接断开”);
}
}
返回ConditionEvaluationResult.enabled(“无假设,继续…”);
}
}
因此,我们可以在测试中执行以下操作

@测试
@SkipWhenEndpoint不可用(uri=”https://www.google.com")
无效调用2(){
assertTrue(HttpCaller.call(“https://www.google.com"));
}
我们可以继续在
@SkipWhenEndpointUnavailable
上添加
@Test
注释,并将其从测试代码中删除。比如说:

@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(EndpointAvailabilityCondition.class)
@试验
public@interface skipwhenEndpoint不可用{
字符串uri();
}
类HttpCallerTest{
@SkipWhenEndpoint不可用(uri=”https://www.google.com")
无效调用2(){
assertTrue(HttpCaller.call(“https://www.google.com"));
}
}

我希望它能有所帮助。

在JUnit5中,我们有两种不同的方法来完成这项任务

出于演示目的,我创建了一个基本类,用于向url发送请求 作为参数传递给它的
调用(字符串url)
方法和 根据请求结果返回
true
false
。 方法的主体在这里是不相关的

使用
假设.assumeTrue()/assumeFalse()
方法
假设
类为我们提供了两个重载方法-
假设真
假设为false
。这个想法是,如果假设是错误的,测试将被跳过

所以,测试是这样的

@测试
void call1(){
假设为真(新的EndpointChecker(),“端点不可用”);
assertTrue(HttpCaller.call(“https://www.google.com"));
}
以下是
EndpointChecker
类的代码

静态类EndpointChecker实现BooleanSupplier{
@凌驾
公共布尔getAsBoolean(){
//在此处检查端点并返回true或false
返回false;
}
}
当测试运行时,将首先检查端点的可用性,如果已启动,则测试将运行

使用JUnit5扩展机制。 那么,让我们从创建注释开始。这很简单

@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(EndpointAvailabilityCondition.class)
public@interface skipwhenEndpoint不可用{
字符串uri();
}
EndpointAvailabilityCondition
class。尽管它看起来很大,但总体逻辑非常简单

import static org.junit.platform.commons.util.AnnotationUtils.findAnnotation;
公共类EndpointAvailabilityCondition实现ExecutionCondition{
@凌驾
公共条件EvaluationResult evaluateExecutionCondition(扩展上下文上下文){
final var optional=findAnnotation(context.getElement(),SkipWhenEndpointUnavailable.class);
if(可选的.isPresent()){
最后一个Skipwhen