次の階層があります。
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 として検証される 2 つの文字列が含まれています。
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}) という注釈が付けられます
ConstraintViolationException の代わりに IllegalArgumentException を起動する理由は、この問題の範囲外です。制約違反をキャッチし、代わりに IllegalArgumentException をスローします。
アセンブラーのビルド メソッドには、次の注釈が付けられた制約もあります。
public Response build(@Valid @NotNull A request) {
....
}
誰かが私を助けてくれれば、とても感謝しています。とにかくありがとう。