Skip to content

Commit 98d548c

Browse files
committed
test: 补充-jakarta模块的测试用例
1 parent b3666ac commit 98d548c

File tree

10 files changed

+344
-39
lines changed

10 files changed

+344
-39
lines changed

spel-validator-core/pom.xml

-6
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,6 @@
4646
<scope>test</scope>
4747
</dependency>
4848

49-
<dependency>
50-
<groupId>org.glassfish</groupId>
51-
<artifactId>javax.el</artifactId>
52-
<scope>test</scope>
53-
</dependency>
54-
5549
<dependency>
5650
<groupId>ch.qos.logback</groupId>
5751
<artifactId>logback-classic</artifactId>

spel-validator-jakarta/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@
33
此模块是可以直接使用的,基于 `jakarta.validation-api` 的参数校验工具模块。
44

55
内包含启动注解和一些常用的约束注解,可以直接使用。
6+
7+
注意:此模块最低支持的 JDK 版本为 11。

spel-validator-jakarta/pom.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
<artifactId>spel-validator-jakarta</artifactId>
1313

1414
<properties>
15-
<maven.compiler.source>8</maven.compiler.source>
16-
<maven.compiler.target>8</maven.compiler.target>
15+
<maven.compiler.source>11</maven.compiler.source>
16+
<maven.compiler.target>11</maven.compiler.target>
1717
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18+
<hibernate-validator.version>8.0.1.Final</hibernate-validator.version>
1819
</properties>
1920

2021
<dependencies>
@@ -26,7 +27,6 @@
2627
<dependency>
2728
<groupId>org.hibernate.validator</groupId>
2829
<artifactId>hibernate-validator</artifactId>
29-
<version>8.0.1.Final</version>
3030
</dependency>
3131

3232
<dependency>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package cn.sticki.spel.validator.jakarta;
2+
3+
import cn.sticki.spel.validator.jakarta.bean.ExampleTestBean;
4+
import cn.sticki.spel.validator.jakarta.bean.SpelValidTestBean;
5+
import org.junit.jupiter.api.Assertions;
6+
import org.junit.jupiter.api.Test;
7+
8+
/**
9+
* 约束类测试
10+
*
11+
* @author 阿杆
12+
* @version 1.0
13+
* @since 2024/6/15
14+
*/
15+
public class ConstrainTest {
16+
17+
/**
18+
* 这是一个测试示例
19+
*/
20+
@Test
21+
void testExample() {
22+
boolean verified = JakartaSpelValidator.check(ExampleTestBean.testCase());
23+
Assertions.assertTrue(verified);
24+
25+
boolean innerTest = JakartaSpelValidator.check(ExampleTestBean.innerTestCase());
26+
Assertions.assertTrue(innerTest);
27+
}
28+
29+
@Test
30+
void testSpelValid() {
31+
boolean verified = JakartaSpelValidator.check(SpelValidTestBean.paramTestCase());
32+
Assertions.assertTrue(verified);
33+
}
34+
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package cn.sticki.spel.validator.jakarta;
2+
3+
import cn.sticki.spel.validator.core.SpelValidExecutor;
4+
import cn.sticki.spel.validator.core.result.FieldError;
5+
import cn.sticki.spel.validator.core.result.ObjectValidResult;
6+
import cn.sticki.spel.validator.test.util.AbstractSpelValidator;
7+
import cn.sticki.spel.validator.test.util.VerifyObject;
8+
import jakarta.validation.ConstraintViolation;
9+
import jakarta.validation.Validation;
10+
import jakarta.validation.Validator;
11+
import lombok.extern.slf4j.Slf4j;
12+
import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator;
13+
14+
import java.util.List;
15+
import java.util.Set;
16+
import java.util.stream.Collectors;
17+
18+
/**
19+
* 测试验证工具类
20+
*
21+
* @author 阿杆
22+
* @version 1.0
23+
* @since 2024/6/13
24+
*/
25+
@Slf4j
26+
public class JakartaSpelValidator extends AbstractSpelValidator {
27+
28+
private static final JakartaSpelValidator INSTANCE = new JakartaSpelValidator();
29+
30+
@SuppressWarnings("resource")
31+
private static final Validator validator = Validation.byDefaultProvider()
32+
.configure()
33+
.messageInterpolator(new ParameterMessageInterpolator())
34+
.buildValidatorFactory().getValidator();
35+
36+
/**
37+
* 验证约束结果是否符合预期
38+
*/
39+
public static boolean check(List<VerifyObject> verifyObjectList) {
40+
return INSTANCE.checkConstraintResult(verifyObjectList);
41+
}
42+
43+
/**
44+
* 参数校验
45+
* <p>
46+
* 调用此方法会触发约束校验
47+
*
48+
* @return 校验结果
49+
*/
50+
@Override
51+
public ObjectValidResult validate(Object obj, String[] spelGroups) {
52+
// 如果对象没有使用 SpelValid 注解,则直接调用验证执行器进行验证
53+
// 这种情况下,只会验证本框架提供的约束注解
54+
if (!obj.getClass().isAnnotationPresent(SpelValid.class)) {
55+
return SpelValidExecutor.validateObject(obj, spelGroups);
56+
}
57+
58+
// 通过 @Valid 的方式进行验证
59+
Set<ConstraintViolation<Object>> validate = validator.validate(obj);
60+
if (validate == null || validate.isEmpty()) {
61+
return ObjectValidResult.EMPTY;
62+
}
63+
ObjectValidResult validResult = new ObjectValidResult();
64+
List<FieldError> list = validate.stream().map(JakartaSpelValidator::convert).collect(Collectors.toList());
65+
validResult.addFieldError(list);
66+
return validResult;
67+
}
68+
69+
private static FieldError convert(ConstraintViolation<Object> violation) {
70+
return FieldError.of(violation.getPropertyPath().toString(), violation.getMessage());
71+
}
72+
73+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package cn.sticki.spel.validator.jakarta.bean;
2+
3+
import cn.sticki.spel.validator.constrain.SpelAssert;
4+
import cn.sticki.spel.validator.constrain.SpelNotNull;
5+
import cn.sticki.spel.validator.jakarta.SpelValid;
6+
import cn.sticki.spel.validator.test.util.ID;
7+
import cn.sticki.spel.validator.test.util.VerifyFailedField;
8+
import cn.sticki.spel.validator.test.util.VerifyObject;
9+
import jakarta.validation.constraints.NotNull;
10+
import lombok.Builder;
11+
import lombok.Data;
12+
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
16+
/**
17+
* 作为示例的测试 bean
18+
*
19+
* @author 阿杆
20+
* @version 1.0
21+
* @since 2024/6/13
22+
*/
23+
public class ExampleTestBean {
24+
25+
@Data
26+
@SpelValid
27+
public static class ParamTestBean implements ID {
28+
29+
private int id;
30+
31+
@NotNull
32+
private Boolean switchAudio;
33+
34+
/**
35+
* 当 switchAudio 为 true 时,校验 audioContent,audioContent 不能为null
36+
*/
37+
@SpelNotNull(condition = "#this.switchAudio == true", message = "语音内容不能为空")
38+
private String audioContent;
39+
40+
/**
41+
* 枚举值校验
42+
* <p>
43+
* 通过静态方法调用,校验枚举值是否存在
44+
*/
45+
@SpelAssert(assertTrue = " T(cn.sticki.spel.validator.jakarta.enums.ExampleEnum).getByCode(#this.testEnum) != null ", message = "枚举值不合法")
46+
private Integer testEnum;
47+
48+
}
49+
50+
public static List<VerifyObject> testCase() {
51+
ArrayList<VerifyObject> result = new ArrayList<>();
52+
53+
ParamTestBean bean = new ParamTestBean();
54+
bean.setId(1);
55+
bean.setSwitchAudio(true);
56+
bean.setAudioContent("hello");
57+
bean.setTestEnum(1);
58+
result.add(VerifyObject.of(bean));
59+
60+
ParamTestBean bean2 = new ParamTestBean();
61+
bean2.setId(2);
62+
bean2.setSwitchAudio(null);
63+
bean2.setAudioContent(null);
64+
bean2.setTestEnum(0);
65+
result.add(VerifyObject.of(
66+
bean2,
67+
VerifyFailedField.of(ParamTestBean::getSwitchAudio),
68+
VerifyFailedField.of(ParamTestBean::getTestEnum, "枚举值不合法")
69+
));
70+
71+
ParamTestBean bean3 = new ParamTestBean();
72+
bean3.setId(3);
73+
bean3.setSwitchAudio(null);
74+
bean3.setAudioContent(null);
75+
bean3.setTestEnum(null);
76+
result.add(VerifyObject.of(bean3, true));
77+
78+
return result;
79+
}
80+
81+
/**
82+
* 内部嵌套类测试
83+
*/
84+
@Data
85+
@Builder
86+
@SpelValid
87+
public static class InnerTestBean implements ID {
88+
89+
private int id;
90+
91+
@SpelValid()
92+
private TestClass testClass;
93+
94+
@Data
95+
@Builder
96+
public static class TestClass {
97+
98+
@SpelNotNull
99+
private Integer testInt;
100+
101+
}
102+
103+
}
104+
105+
public static List<VerifyObject> innerTestCase() {
106+
ArrayList<VerifyObject> result = new ArrayList<>();
107+
108+
InnerTestBean bean = InnerTestBean.builder().id(1)
109+
.testClass(InnerTestBean.TestClass.builder().testInt(1).build())
110+
.build();
111+
result.add(VerifyObject.of(bean));
112+
113+
InnerTestBean bean2 = InnerTestBean.builder().id(2)
114+
.testClass(InnerTestBean.TestClass.builder().testInt(null).build())
115+
.build();
116+
result.add(VerifyObject.of(bean2, VerifyFailedField.of("testClass.testInt")));
117+
118+
InnerTestBean bean3 = InnerTestBean.builder().id(3)
119+
.testClass(null)
120+
.build();
121+
result.add(VerifyObject.of(bean3));
122+
123+
return result;
124+
}
125+
126+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package cn.sticki.spel.validator.jakarta.bean;
2+
3+
import cn.sticki.spel.validator.constrain.SpelNotNull;
4+
import cn.sticki.spel.validator.jakarta.SpelValid;
5+
import cn.sticki.spel.validator.test.util.ID;
6+
import cn.sticki.spel.validator.test.util.VerifyFailedField;
7+
import cn.sticki.spel.validator.test.util.VerifyObject;
8+
import lombok.Builder;
9+
import lombok.Data;
10+
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
/**
15+
* SpelValid 测试用例
16+
*
17+
* @author 阿杆
18+
* @version 1.0
19+
* @since 2024/9/22
20+
*/
21+
public class SpelValidTestBean {
22+
23+
public static List<VerifyObject> paramTestCase() {
24+
ArrayList<VerifyObject> result = new ArrayList<>();
25+
26+
// On
27+
result.add(VerifyObject.of(
28+
ParamTestBean.builder().id(1).condition(true).test(null).build(),
29+
VerifyFailedField.of(ParamTestBean::getTest)
30+
));
31+
32+
// off
33+
result.add(VerifyObject.of(
34+
ParamTestBean.builder().id(2).condition(false).test(null).build()
35+
));
36+
37+
return result;
38+
}
39+
40+
/**
41+
* 参数测试
42+
*/
43+
@Data
44+
@Builder
45+
@SpelValid(condition = "#this.condition == true")
46+
public static class ParamTestBean implements ID {
47+
48+
private int id;
49+
50+
private boolean condition;
51+
52+
@SpelNotNull
53+
private String test;
54+
55+
}
56+
57+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package cn.sticki.spel.validator.jakarta.enums;
2+
3+
import lombok.Getter;
4+
5+
/**
6+
* 示例枚举
7+
*
8+
* @author 阿杆
9+
* @version 1.0
10+
* @since 2024/5/1
11+
*/
12+
@Getter
13+
public enum ExampleEnum {
14+
15+
ONE(1),
16+
17+
TWO(2),
18+
19+
THREE(3),
20+
21+
FOUR(4),
22+
23+
FIVE(5);
24+
25+
private final Integer code;
26+
27+
ExampleEnum(Integer code) {
28+
this.code = code;
29+
}
30+
31+
public static ExampleEnum getByCode(Integer code) {
32+
if (code == null) {
33+
throw new IllegalArgumentException("code can not be null");
34+
}
35+
for (ExampleEnum value : values()) {
36+
if (value.code.equals(code)) {
37+
return value;
38+
}
39+
}
40+
return null;
41+
}
42+
43+
}

spel-validator-javax/src/test/java/cn/sticki/spel/validator/javax/util/JavaxSpelValidator.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import cn.sticki.spel.validator.test.util.AbstractSpelValidator;
88
import cn.sticki.spel.validator.test.util.VerifyObject;
99
import lombok.extern.slf4j.Slf4j;
10+
import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator;
1011

1112
import javax.validation.ConstraintViolation;
1213
import javax.validation.Validation;
@@ -28,7 +29,10 @@ public class JavaxSpelValidator extends AbstractSpelValidator {
2829
private static final JavaxSpelValidator INSTANCE = new JavaxSpelValidator();
2930

3031
@SuppressWarnings("resource")
31-
private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
32+
private static final Validator validator = Validation.byDefaultProvider()
33+
.configure()
34+
.messageInterpolator(new ParameterMessageInterpolator())
35+
.buildValidatorFactory().getValidator();
3236

3337
/**
3438
* 验证约束结果是否符合预期

0 commit comments

Comments
 (0)