结合github/junit5-samples-extensions,简单说明一下@ExtendWith的底层执行流程。代码@ExtendWith(RandomParametersExtension.class)classRandomParametersExtensionTests{@TestvoidinjectsInteger(@Randominti,@Randomintj){assertNotEquals(i,j);}}公共类RandomParametersExtension实现ParameterResolver{@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.PARAMETER)public@interfaceRandom{}@OverridepublicbooleansupportsParameter(ParameterContextparameterContext,ExtensionContextextensionContext){returnparameterContext.isAnnotated(Random.class);}@OverridepublicObjectresolveParameter(ParameterContextparameterContext,ExtensionContextextensionContext){returngetRandomValue(parameterContext.getParameter(),extensionContext);}privateObjectgetRandomValue(Parameterparameter,ExtensionContextextensionContext){Class>type=parameter.getType();java.util.Random随机=extensionContext.getRoot().getStore(Namespace.GLOBAL)//.getOrComputeIfAbsent(java.util.Random.class);如果(int.class.equals(type)){返回random.nextInt();}if(double.class.equals(type)){returnrandom.nextDouble();}thrownewParameterResolutionException("Norandomgeneratorimplementedfor"+type);}}时序图【图】执行流程在intellij中执行test1如果是maven工程,在intellij-rj中执行一个main方法2如果是gradle,则是直接从main调用junit-platform-launcher的入口gradle的方法。创建一个NodeTestTask。根据junit的配置,选择executorService,默认单线程,配置为NodeTestTask。创建一个ClassBasedTestDescriptor来描述测试类RandomParametersExtensionTests。ClassBasedTestDescriptor调用prepare方法扫描测试类、参数、方法上的所有注解,比如类上的@extendWith,方法上的@BeforeALLl等。@extendWith修饰的extension放在extensionRegistry中,一个@BeforeALLl修改的放在对应的List
