gpt4 book ai didi

java - 我将如何编写自动检查以确保每个参数都有特定的注释?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:00:22 26 4
gpt4 key购买 nike

我正在编写一个 Rest API,我的自动化测试直接调用该类而不将其部署到服务器。例如,我正在测试这个方法:

@GET
@Path("/{referenceId}")
@Produces("application/json")
public String findByReferenceId(@PathParam("referenceId") String referenceId,
String view) {

我的测试正在检查逻辑是否有效并且它们通过了。但是这段代码有一个错误:我忘记在那个 view 参数上添加一个 @QueryParam 注释。所以这段代码在测试时有效,但如果您尝试在已部署的应用程序上使用此资源,则 view 参数将永远无法设置。

有很多方法可以解决这个问题,但我目前的偏好是以某种方式编写一个自动检查,如果一个方法有一个 @Path 注释,那么每个参数都必须有一个 @PathParam@QueryParam 或任何其他有效注释都可以存在。

与新的端到端测试相比,我更喜欢这个,因为我的其他测试已经涵盖了该逻辑的 95%。我只是不知道如何自动执行此检查。我正在使用 Maven 和 CXF(这意味着我正在使用 Spring)。我希望有一个插件可以配置为执行此操作。


我刚刚意识到:拥有一个没有注释的参数是有效的。当你这样做时,jax-rs 将它设置为你传入的实体。我不确定如何处理这种情况。我可以创建我自己的名为 @Payload 的自定义注解,并告诉人们使用它,但这似乎有些不对劲。

最佳答案

这是我的解决方案。最后,我决定创建一个 @RawPayload 注释。否则,我不知道丢失的注释是否是有意的。这是我获得 Reflections 类的地方:https://code.google.com/p/reflections/

import org.junit.Test;
import org.reflections.Reflections;
import org.reflections.scanners.MethodAnnotationsScanner;

import javax.ws.rs.Path;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Set;

import static org.junit.Assert.assertTrue;

...

@Test
public void testAllParametersAreAnnotated() throws Exception {
String message = "You are missing a jax-rs annotation on a method's parameter: ";
Reflections reflections = new Reflections("package.for.my.services", new MethodAnnotationsScanner());
Set<Method> resourceMethods = reflections.getMethodsAnnotatedWith(Path.class);
assertTrue(resourceMethods.size() > 0);

for (Method resourceMethod : resourceMethods) {
for (int i = 0; i < resourceMethod.getGenericParameterTypes().length; i++) {
Annotation[] annotations = resourceMethod.getParameterAnnotations()[i];
boolean annotationExists = annotations.length > 0;
assertTrue(message +
resourceMethod.getDeclaringClass().getCanonicalName() +
"#" +
resourceMethod.getName(),
annotationExists && containsJaxRsAnnotation(annotations));
}
}
}

private boolean containsJaxRsAnnotation(Annotation[] annotations) {
for (Annotation annotation : annotations) {
if (annotation instanceof RawPayload) {
return true;
}
if (annotation.annotationType().getCanonicalName().startsWith("javax.ws.rs")) {
return true;
}
}
return false;
}

这是我的注释:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
* I'm creating this marker so that we can put it on raw payload params. This is normally unnecessary,
* but it lets me write a very useful automated test.
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface RawPayload {
}

关于java - 我将如何编写自动检查以确保每个参数都有特定的注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29661523/

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