2

我有下一个层次结构:

public class A extends B {
   @Valid 
   public A(String languageCode, C token) {
      super(languageCode, token);
   }  
}

B 类具有属性调用语言代码,仅当服务具有 @Validated({RequiringLanguageCode.class}) 时才应使用 @NotEmpty 进行验证

 public class B extends D {

    private String languageCode;

    @Valid
    public B(String languageCode, C token) {
        super(token);
        this.languageCode = languageCode;
    }

    @NotEmpty(groups = {RequiringLanguageCode.class})
    public String getLanguageCode() {
        return languageCode;
    }
}

现在,D 是具有应验证为 NotNull 的 C 属性以及 C 类内部的值的基类。

public class D {

    private C token;

    @Valid
    public D(C token) {
        this.token = token;
    }

    @NotNull
    public C getToken() {
        return token;
    }
}

C 类包含两个验证为@NotEmpty 的字符串:

public class C {

    private String value1;

    private String value2;

    public C(String value1,
            String value2) {
        this.value1 = value1;
        this.value2 = value2;
    }

    @NotEmpty
    public String getValue1() {
        return value1;
    }

    @NotEmpty
    public String getValue2() {
        return value2;
    }
}

当尝试使用 mockito 进行测试时,如果令牌值(value1 和 value2)为空,则不会验证 C 类的值。

有人可以帮助我吗? 有人知道发生了什么吗?

测试如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("test")
public class ATest {

    @Autowired
    private AAssembler aAssembler;

    @Mock
    A request;

    @Mock
    C token;

    @Test
    public void test() {
        when(token.getValue1()).thenReturn("");
        when(token.getValue2()).thenReturn("key");
        when(request.getToken()).thenReturn(token);
        assertThatIllegalArgumentException()
           .isThrownBy(() -> aAssembler.build(request));
    }
}

AAssembler 被注释为 @Validated({RequiringLanguageCode.class})

我启动 IllegalArgumentException 而不是 ConstraintViolationException 的原因超出了这个问题的范围。我发现约束违规,而是抛出 IllegalArgumentException。

Assembler 构建方法还有一个约束,注释为:

public Response build(@Valid @NotNull A request) {
....
} 

如果有人可以帮助我,我将非常感激。不管怎么说,还是要谢谢你。

4

1 回答 1

2

javax.validation.ConstraintDeclarationException: HV000131: A method return value must not be marked for cascaded validation more than once in a class hierarchy, but the following two methods are marked as such:在测试用javax.validation.valid.

基于这个 AutoValue问题,我认为这里也可能发生同样的情况。Mockito默认复制所有注释。所以我能够通过防止这种情况来解决这个问题。

A stub = Mockito.mock(A.class, withSettings().withoutAnnotations());

与 AutoValue 解决方案相比的缺点是不会复制注释。所以如果你需要它们,你就会被卡住。

问候克里斯蒂安

于 2020-06-10T08:51:12.783 回答