首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >springboot中自定义验证的参数化junit测试

springboot中自定义验证的参数化junit测试
EN

Stack Overflow用户
提问于 2021-06-21 15:34:27
回答 1查看 596关注 0票数 1

我在springboot中有这个验证器,当一个整数不是介于1到3之间时,它会产生错误,并且我使用addConstraintViolation从属性文件打印消息。

代码语言:javascript
运行
复制
public class SizeValidator implements ConstraintValidator<SizeValidation, Integer> {
    private int maxSize = 500;
    private int minSize = 1;

    @Override
    public void initialize(SizeValidation constraintAnnotation) {
        maxSize = constraintAnnotation.mxSize();
        minSize = constraintAnnotation.minSize();
    }

    @Override
    public boolean isValid(Integer givenSize, ConstraintValidatorContext context) {
        if (givenSize > maxSize || givenSize<= minPageSize) {
            addConstraintViolation(givenSize, "{Size.wrongSize.message}", context);
            return false;
        }
        return true;
    }

    private void addConstraintViolation(Integer givenSize, String errorMessage, ConstraintValidatorContext context) {
        final HibernateConstraintValidatorContext customContext = context.unwrap(HibernateConstraintValidatorContext.class);
        customContext.addExpressionVariable("givenSize", givenSize);

        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(errorMessage)
                .addConstraintViolation();
    }
}

在我的validation.properties

大小为${givenSize}的

Size.wrongSize.message=Value应介于1和3之间。

我想为它编写一个参数化的junit测试,如下所示,但是它返回nullpointerexception,请问我在哪里做错了?

sizeValidator.addConstraintViolation(SizeValidator.java:33)的

java.lang.NullPointerException

intellij表示它的位置

context.buildConstraintViolationWithTemplate(errorMessage)

.addConstraintViolation();

代码语言:javascript
运行
复制
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;
    import org.junit.Test;
    import org.junit.experimental.runners.Enclosed;
    import org.junit.runner.RunWith;
    import org.junit.runners.Parameterized;
    
    import javax.validation.ConstraintValidatorContext;
    import java.util.Arrays;
    import java.util.Collection;
    
    import static org.junit.Assert.assertTrue;
    import static org.mockito.ArgumentMatchers.anyString;
    import static org.mockito.ArgumentMatchers.eq;
    import static org.mockito.Mockito.mock;
    import static org.mockito.Mockito.when;
    
        @RunWith(Enclosed.class)
        public class SizeValidatorTest{
        
            @RunWith(Parameterized.class)
            public static class TestValidEntries {
                private SizeValidator validator = new SizeValidator();
                private Integer val;
        
        
                public TestValidEntries(Integer val) {
                    super();
                    this.val = val;
                }
        
                @Test
                public void test() {
                    assertTrue(isValid(val));
                }
        
                @Parameterized.Parameters(name = "{index} Valid: {0}")
                public static Collection data() {
                    return Arrays.asList(
                            -1, 501
                    );
                }
        
                public boolean isValid(Integer value) {
                    final HibernateConstraintValidatorContext context = mock(HibernateConstraintValidatorContext.class);
                    when(context.unwrap(HibernateConstraintValidatorContext.class)).thenReturn(context);
                    when(context.addExpressionVariable(eq("nonUnique"), anyString())).thenReturn(context);
                    when(context.getDefaultConstraintMessageTemplate()).thenReturn("template");
                    final ConstraintValidatorContext.ConstraintViolationBuilder builder = mock(ConstraintValidatorContext.ConstraintViolationBuilder.class);
                    when(context.buildConstraintViolationWithTemplate("template")).thenReturn(builder);
        
                    when(builder.addPropertyNode(anyString())).thenReturn(mock(ConstraintValidatorContext.ConstraintViolationBuilder.NodeBuilderCustomizableContext.class));
        
                    return validator.isValid(value, context);
                }
        
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-21 15:55:02

问题在于context模拟的配置。

您的配置说明:

代码语言:javascript
运行
复制
when(context
      .buildConstraintViolationWithTemplate(
          "template"))
.thenReturn(builder);

但是在测试代码中传递的字符串是:"{Size.wrongSize.message}",因为这个字符串与模拟不匹配,因此返回null

更好的方法是始终在测试方法的排列部分(或设置中)使用非特定的匹配器(如anyString() ),在测试方法的断言部分中,只有与Mockito.verify()一起使用特定的匹配器(或值)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68070755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档