当前位置: 首页 > 知识库问答 >
问题:

ArchUnit-确保方法参数已注释

穆俊杰
2023-03-14

我正在尝试编写一个ArchUnit测试规则,它应该确保使用@ComponentInterface注释的接口具有使用@Input注释注释的方法参数。像这样:

ArchRule rule =
        methods()
            .that()
            .areDeclaredInClassesThat()
            .areInterfaces()
            .and()
            .areDeclaredInClassesThat()
            .areAnnotatedWith(ComponentInterface.class)
            .should()
            .haveRawParameterTypes(
                allElements(CanBeAnnotated.Predicates.annotatedWith(Input.class)));

界面如下所示:

@ComponentInterface
public interface AdminComponent {
  void login(@Input(name = "loginString") String loginString);
}

但测试失败,出现如下错误:方法

在这种情况下,规则应该如何正常工作?

附言:在做了一些调试后,发现haveRawParameterTypes检查参数类型(类)是否有注释,而不是方法参数本身。所以它查看String类并发现它没有用@Input注释。很高兴知道,但这并不能解决问题。


共有1个答案

东门茂实
2023-03-14

您可以始终回退到反射API:

ArchRule rule = methods()
    .that().areDeclaredInClassesThat().areInterfaces()
    .and().areDeclaredInClassesThat().areAnnotatedWith(ComponentInterface.class)
    .should(haveAllParametersAnnotatedWith(Input.class));

ArchCondition<JavaMethod> haveAllParametersAnnotatedWith(Class<? extends Annotation> annotationClass) {
  return new ArchCondition<JavaMethod>("have all parameters annotated with @" + annotationClass.getSimpleName()) {
    @Override
    public void check(JavaMethod method, ConditionEvents events) {
      boolean areAllParametersAnnotated = true;
      for (Annotation[] parameterAnnotations : method.reflect().getParameterAnnotations()) {
        boolean isParameterAnnotated = false;
        for (Annotation annotation : parameterAnnotations) {
          if (annotation.annotationType().equals(annotationClass)) {
            isParameterAnnotated = true;
          }
        }
        areAllParametersAnnotated &= isParameterAnnotated;
      }
      String message = (areAllParametersAnnotated ? "" : "not ")
          + "all parameters of " + method.getDescription()
          + " are annotated with @" + annotationClass.getSimpleName();
      events.add(new SimpleConditionEvent(method, areAllParametersAnnotated, message));
    }
  };
}
 类似资料:
  • 我对模型映射器进行了以下配置,以将用户类的实例转换为扩展getuserdto的实例。 在注释掉setReceivedExpense之前,我收到了这个错误: 在花费了一些时间并没有找到根本原因之后,我试图删除DTO中所有可疑的循环依赖项(我在GetExpenseDto中引用了GetExpenseDto,expenseDtoConverter的返回结果),我仍然收到相同的错误,我注释掉了map()。s

  • 我正在编写一个可序列化的类,它接受多个参数,包括一个函数: 存储在成员变量中,因此需要可序列化。如果分配给它们的类型是可序列化的,则Javalambda是可序列化的。如果使用lambda创建,那么确保在构造函数中传递的是可序列化的最佳方法是什么? > 创建一个可序列化函数,并使用该函数: 问题: 现在,

  • 问题内容: 我刚刚开始在Java 8中使用注释,并得到了一些意外的结果。 我有这样的方法: 我编写了一个JUnit测试,为参数searchList传递了空值。我原以为会发生某种类型的错误,但好像没有注释就通过了。这是预期的行为吗?据我了解,这是允许您跳过编写样板空检查代码。 对于@NotNull应该做什么的解释将不胜感激。 问题答案: 和自己做什么。它们应该充当文档工具。 该注释提醒您在以下情况下

  • 我编写了一个JUnit测试,为参数searchingList传入null值。我原以为会发生某种类型的错误,但结果好像注释不在那里一样。这是意料之中的行为吗?根据我的理解,这是允许您跳过编写样板空校验代码。 如果能解释一下@NotNull到底应该做什么,将会非常感谢。

  • 我希望在没有参数的方法上有注释。在这种情况下,我使用@Cacheable,如下所示 然而,当我调用这个方法时,它没有被执行,而是得到了如下的异常 org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): 在 'org.springframework.cache.interceptor.CacheExp

  • 问题内容: 而且我正在尝试更改方法注释,但是java.lang.reflect.Method不包含任何地图字段(例如“ annotations”)或方法(例如“ getDeclaredAnnotationMap”) 只有但是我可以用这个字节数组做什么? 那么,如何修改方法的注释呢? 编辑: 我创建了:http : //pastebin.com/T2rewcwU 但是,仅编辑此方法实例,如果取消注释