nullpointerexception

dphi5xsq  于 2021-07-16  发布在  Java
关注(0)|答案(1)|浏览(399)

我一直在尝试单元测试(不运行spring容器)我的自定义约束注解,但是当我运行测试时,nullpointerexception被抛出,我不知道为什么会发生这种情况。
nullpointerexception指出 this.validator = null 在验证程序类中。
我在听那个答案https://stackoverflow.com/a/41671471/9377513 写测试的时候。但我不知道为什么这种方法在我的情况下不起作用。
测试期间引发的整个异常:

  1. java.lang.NullPointerException: Cannot invoke "javax.validation.Validator.validate(Object, java.lang.Class[])" because "this.validator" is null
  2. at com.radgac.vmmrestapi.annotations.AddressCheckTest.addressCheckWithinRangeTest(AddressCheckTest.java:32)
  3. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  4. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
  5. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  6. at java.base/java.lang.reflect.Method.invoke(Method.java:564)
  7. at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
  8. at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
  9. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
  10. at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
  11. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
  12. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestTemplateMethod(TimeoutExtension.java:92)
  13. at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
  14. at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
  15. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
  16. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
  17. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
  18. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
  19. at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
  20. at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
  21. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210)
  22. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  23. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206)
  24. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)
  25. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)
  26. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
  27. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  28. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
  29. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  30. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
  31. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  32. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
  33. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
  34. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
  35. at org.junit.platform.engine.support.hierarchical.NodeTestTask$DefaultDynamicTestExecutor.execute(NodeTestTask.java:212)
  36. at org.junit.platform.engine.support.hierarchical.NodeTestTask$DefaultDynamicTestExecutor.execute(NodeTestTask.java:192)
  37. at org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor.execute(TestTemplateTestDescriptor.java:139)
  38. at org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor.lambda$execute$2(TestTemplateTestDescriptor.java:107)
  39. at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
  40. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  41. at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
  42. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  43. at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
  44. at java.base/java.util.stream.ReferencePipeline$11$1.accept(ReferencePipeline.java:442)
  45. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  46. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  47. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  48. at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
  49. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  50. at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
  51. at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
  52. at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
  53. at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
  54. at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
  55. at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  56. at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
  57. at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:274)
  58. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  59. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  60. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  61. at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
  62. at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
  63. at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
  64. at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
  65. at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
  66. at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  67. at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
  68. at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:274)
  69. at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
  70. at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
  71. at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
  72. at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
  73. at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
  74. at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  75. at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
  76. at org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor.execute(TestTemplateTestDescriptor.java:107)
  77. at org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor.execute(TestTemplateTestDescriptor.java:42)
  78. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
  79. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  80. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
  81. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  82. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
  83. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  84. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
  85. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
  86. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  87. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
  88. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
  89. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  90. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
  91. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  92. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
  93. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  94. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
  95. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
  96. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  97. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
  98. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
  99. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  100. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
  101. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  102. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
  103. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  104. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
  105. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
  106. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
  107. at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
  108. at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
  109. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
  110. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
  111. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
  112. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
  113. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
  114. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
  115. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
  116. at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
  117. at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
  118. at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
  119. at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)

我的自定义约束注解:

  1. @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @NotNull
  4. @NotEmpty
  5. @NotBlank
  6. @Size(min = 1, max = 5)
  7. @Constraint(validatedBy = {AddressCheckValidator.class})
  8. public @interface AddressCheck {
  9. String message() default "Please provide a valid String with length min=1 and max=5";
  10. Class<?>[] groups() default {};
  11. Class<? extends Payload>[] payload() default {};
  12. }

我的自定义约束验证器:

  1. public class AddressCheckValidator implements ConstraintValidator<AddressCheck, String> {
  2. @Override
  3. public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
  4. return s != null && !s.isEmpty() && !s.isBlank() && s.length() <= 5;
  5. }
  6. }

我的测试班:

  1. public class AddressCheckTest {
  2. private Validator validator;
  3. @Before
  4. public void setUp() {
  5. validator = Validation.buildDefaultValidatorFactory().getValidator();
  6. }
  7. @ParameterizedTest
  8. @ValueSource(strings = {"a", "ab", "abc", "abcd", "abcde"})
  9. public void addressCheckWithinRangeTest(String value) {
  10. var addressCheck = new AddressCheckFieldTest(value);
  11. Set<ConstraintViolation<AddressCheckFieldTest>> violations = validator.validate(addressCheck);
  12. assertTrue(violations.isEmpty());
  13. }
  14. private static class AddressCheckFieldTest {
  15. @AddressCheck
  16. private String addressField;
  17. public AddressCheckFieldTest(String addressField) {
  18. this.addressField = addressField;
  19. }
  20. public String getAddressField() {
  21. return addressField;
  22. }
  23. public void setAddressField(String addressField) {
  24. this.addressField = addressField;
  25. }
  26. }
  27. }

任何帮助都将不胜感激。

7jmck4yq

7jmck4yq1#

只要是测试,就需要用 @SpringBootTest 启动容器并自动连接 Validator 正确使用 @Autowired 注解。

  1. @SpringBootTest
  2. public class AddressCheckTest {
  3. @Autowired
  4. private Validator validator;
  5. // the rest of the code
  6. }

相关问题