gpt4 book ai didi

java - JUnit 方法参数检查是否为 List

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:05:19 24 4
gpt4 key购买 nike

在 JUnit 中,我使用 ParameterResolver动态创建方法参数并将其注入(inject) Test ,这适用于非通用方法,例如下面的方法,它需要 Person peron .我怎样才能将其更改为 List<Person> personList并拥有 supportsParameter检查是否List属于 Person

@ExtendWith({AnnotationProcessor.class})
public void testInject(Person person) {
System.out.println(person);
}

注释处理器.java

@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
throws ParameterResolutionException {
Parameter parameter = parameterContext.getParameter();

return Person.class.equals(parameter.getType());
}

我能使用的最接近的是:

   @Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
throws ParameterResolutionException {
Parameter parameter = parameterContext.getParameter();

if (parameter.getParameterizedType()!= null && List.class.equals(parameter.getType())) {
if (parameter.getParameterizedType() instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType)parameter.getParameterizedType();
Class<?> clazz = (Class<?>)pt.getActualTypeArguments()[0];
if (clazz == Person.class) return true;
}


}

return false;
}

最佳答案

这是执行您想要的操作的注解处理器。我想说你的尝试非常接近。

class AnnotationProcessor implements ParameterResolver{
@Override
public boolean supportsParameter(
ParameterContext parameterContext,
ExtensionContext extensionContext
) {
Parameter parameter = parameterContext.getParameter();

Type type = parameter.getParameterizedType();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
if (!parameterizedType.getRawType().equals(List.class))
return false;
Type firstParameterType = parameterizedType.getActualTypeArguments()[0];
return firstParameterType.equals(Person.class);
}

return false;
}

@Override
public Object resolveParameter(
ParameterContext parameterContext,
ExtensionContext extensionContext
) {
return Arrays.asList(new Person(), new Person());
}
}

它是如何工作的?

通过反射处理注释是一项复杂的任务,因为它是事后添加到 Java 中的。这就是为什么您必须进行所有 instanceof 类型检查的原因。除此之外,它工作可靠 - 我知道,因为我在黑桃中使用它 http://jqwik.net .

为什么有效?

在这种情况下,类型删除不会发生,因为类型删除只会从运行时对象中删除类型。它不会类型声明中删除类型,例如参数和返回类型。如果它做了很多图书馆用泛型类型做的有趣的事情就不会起作用了。 JDK 中存在一些关于泛型类型处理和注释的错误,但只有当您寻求深奥的东西(例如“内部非静态类中的类型参数的注释”)时,它们才会让您满意。对于像您这样的直接用途,一切都应该没问题。

关于java - JUnit 方法参数检查是否为 List<Person>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58193392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com