Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @Valid不会触发@Repository中的验证_Java_Spring Boot_Unit Testing_Bean Validation_Jedis - Fatal编程技术网

Java @Valid不会触发@Repository中的验证

Java @Valid不会触发@Repository中的验证,java,spring-boot,unit-testing,bean-validation,jedis,Java,Spring Boot,Unit Testing,Bean Validation,Jedis,我正在编写单元测试,以检查输入验证在我的Spring存储库中是否有效,但它看起来不像 保持简单,我有一个存储库类: @存储库 公共类CustomerRepository{ //Redis的Java客户端,我将其扩展为JedisConnector,以使其成为Bean 私人绝地武士; @自动连线 公共客户住所(绝地联络员绝地){ 这个。绝地=绝地; } private S save(@Valid S customer)引发CustomerException{ 试一试{ this.jedis.set(

我正在编写单元测试,以检查输入验证在我的Spring存储库中是否有效,但它看起来不像

保持简单,我有一个存储库类:

@存储库
公共类CustomerRepository{
//Redis的Java客户端,我将其扩展为JedisConnector,以使其成为Bean
私人绝地武士;
@自动连线
公共客户住所(绝地联络员绝地){
这个。绝地=绝地;
}
private S save(@Valid S customer)引发CustomerException{
试一试{
this.jedis.set(…);//写入Redis(在测试中模拟)
退货客户;
}捕获(JsonProcessingException e){
抛出新的CustomerException(例如toString());
}
}
}
这将使用以下模型类:

@allargsconstuctor
@诺尔格构装师
@数据//来自龙目岛
公共类客户{
@电子邮件(message=“电子邮件必须有效。”)
私有字符串标识符;
@NotBlank(message=“密码不能为null或空字符串。”)
私有字符串密码;
@URL(message=“URL必须是URL。”)
私有字符串url;
}
所以我写了一个这样的单元测试,希望它抛出一些我可以断言的异常:

@RunWith(SpringRunner.class)
@SpringBootTest(类={JedisConnector.class})
公共类CustomerRepositoryTest{
//无法自动连线,因为需要配置从属bean
私人客户存储客户存储;
@蚕豆
绝地联络员绝地联络员;
@以前
公共作废设置(){
//配置模拟绝地连接器
initMocks(this);
Mockito.when(jedisConnector.select(anyInt())。然后返回(“OK”);
//手动关联
customerRepository=新的customerRepository(jedisConnector);
}
@试验
public void saveShouldFailOnInvalidInput()引发CustomerException{
Mockito.when(jedisConnector.set(anyString(),anyString())。然后返回(“OK”);
//明显无效的输入
客户=新客户(“testemail”、“testurl”);
customerRepository.save(客户);
}
}
但它只是运行,只输出调试消息(我在这个问题中没有提到)如何执行验证?如果可能,我希望避免在存储库的每个方法中明确调用验证器


我在网上看到了许多我试图复制的例子(从贝尔东到佐恩,当然在这个网站上有很多问题,包括),但仍然没有成功。我遗漏了什么?

如果您想通过使用
存储库
,那么您需要实施
集成测试,以便
javax.validation.ConstraintViolationException
通过显示
不能为空来抛出,但是如果您只想测试这些验证,那么您必须使用通过以下方式验证验证程序:

1.-添加以下依赖项:

<dependency> 
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.13.Final</version>
</dependency> 

为了使我的类成为集成测试,我应该做哪些更改?我得到了检查每个验证的单独测试,但我不明白答案的开头。您需要加载
数据源
。您可以使用以下
嵌入式数据库
进行测试
@AutoConfigureEmbeddedDatabase
注释,让我使用
集成测试来分享答案
让我知道这是否对您有帮助。谢谢,谢谢。好的,我来测试一下。没有办法只模拟我的DB连接并执行方法的其余部分,包括@Valid checks吗?我不明白为什么会有一个“真正的”DB(尽管是在内存中)是解决方案的一部分…
模拟
不是真实的环境,那么如果您希望抛出
ConstraintViolationException
,以便验证其内容,那么应该创建一个
嵌入式数据库
,以模拟真实的数据源
import javax.validation.Validation;
import javax.validation.Validator;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
public class CustomerValidationTest {

    private Validator validator;

    @Before
    public void setupValidatorInstance() {
        validator = Validation.buildDefaultValidatorFactory().getValidator();
    }

    @Test
    public void whenNotEmptyPassword_thenNoConstraintViolations() {
        Customer customer = new Customer();
        customer.setPassword("");
        Set<ConstraintViolation<Customer>> violations = validator.validate(customer);

        assertThat(violations.size()).isEqualTo(1);
    }
}