当前位置: 首页 > 知识库问答 >
问题:

在单元测试期间,Springbean未自动连接到自定义Java验证器类

艾焕
2023-03-14

我有一个用Java验证框架注释的模型类。

@ValidClient
public class Client implements Serializable{
    private static final long SERIAL_VERSION_UID = 1L;
    @NotNull
    private Integer primaryKey;
    @NotEmpty
    private String id;
    @NotEmpty
    private String name;
    private Address address;
    ...
}

我已经编写了一个自定义验证器类“ClientValidator”,以根据业务需求验证下面的模型类。

public class ClientIdValidator implements ConstraintValidator<ValidClient, String> {
    @Autowired
    private IClientService service;

    private Map<String, Client> clientMap = null;

    @Override
    public void initialize(ValidClient constraintAnnotation) {
    }

    @Override
    public boolean isValid(String clientId, ConstraintValidatorContext context) {
        if(clientMap == null) {
            Map<String, Client> map = new ConcurrentHashMap<>();

            for (Client client : service.getAllClients()) {
                map.put(client.getId(), client);
            }
            clientMap = map;
        }

        return clientMap.get(clientId) !=null;
    }
}

如您所见,我的自定义验证器与Springbean自动连接,它在生产代码中运行良好。但是,当我尝试为模型对象客户机编写单元测试时,Spring autowired字段IClientService服务为null,并且不是自动连接的。由于我无法访问实例化的自定义验证器的实例,因此我不确定如何填充此自动连接字段。我想知道它是如何在生产代码中自动连接的,而不是在单元测试代码中。

下面是我编写的Spock单元测试代码。

@ContextConfiguration(classes = [TestAppConfig.class])
class ClientTest extends Specification {
    def "test"(){
        expect:
        LocalValidatorFactoryBean validator = TestAppConfig.getApplicationContext().getBean("validator")
        def validator1 = validator.getValidator()
        validator1.validate(input)

        where:
        input | messageTemplates
        new Client() | "test"
    }
}

如何在单元测试时将IClientService的实例自动连接到自定义验证器中?

共有1个答案

羊舌庆
2023-03-14

我通过从POJO中删除@ValidClient解决了这个问题。这里不需要它,因为我用这个注释注释了我的方法参数。

通过删除自定义注释,现在正在调用默认验证器。

 类似资料:
  • 我正在尝试使用自定义身份验证提供程序配置Spring Security性。但是,我想在服务中自动装配以处理实际的数据库身份验证。我已经验证它在没有这个自动装配bean的情况下工作(只是在提供程序中硬编码)。我也在使用SpringMVC与hibernate结合使用。我目前正在使用根配置(hibernate等)和webMVC使用java注释和Spring使用xml进行混合方法。我知道这是不赞成的,但我

  • 我有一个Spring Boot应用程序,它包含一个用户类——所有字段都有标准的JSR-303注释(@NotNull、@Size等),验证工作正常。 但是,当我向User添加自定义验证时,我无法将依赖项注入自定义验证器: @uniqueUsername注释声明为: 注释字段: 以及验证程序的用法: 问题是UserRepository在UniqueUsernameValidator中没有自动配置。字段

  • 我想知道你是否可以使用vee validate插件编写自定义日期验证,其中结束日期不能小于开始日期?我到处寻找,我找不到确切的答案。 如果没有办法实现这一点,那么我可以凑合着没有它,但是,现在我已经在我的模板中实现了我的开始日期是: 我的脚本如下所示: 但是没有出现任何验证。我想我在我的脚本中丢失了一些东西,但我不确定如何将日期实现到那里。任何帮助将不胜感激。

  • 问题内容: 此自定义验证指令是官方角度网站上提供的示例。 http://docs.angularjs.org/guide/forms会 检查文本输入是否为数字格式。 为了对该代码进行单元测试,我编写了以下代码: 然后我得到这个错误: 我到处都放置了print语句以查看发生了什么,而且该指令似乎从未被调用过。测试像这样的简单指令的正确方法是什么? 问题答案: 另一个答案的测试应写为: 请注意,now

  • 我创建了自己的库(com.custom.mylib),它返回一个字符串,如下所示。 我创建了一个将使用上述库的项目。我已将lib作为pom依赖项包含在内。但是当我尝试从我的应用程序调用库方法时。我得到了下面的错误。如何解决它? 请考虑在您的配置中定义一个“com.custom.mylog.MyLibrary”类型的bean。 我在application.properties文件中也有下面的内容,这

  • 问题内容: 有什么工具可以自动生成 Java 代码的单元测试? 更新: 主要用途是为将要重构的遗留代码快速生成单元测试。自动生成后,无需自动使测试与代码保持同步。 在这里提出了几乎相同的问题,但是答案是.NET而不是Java(Pex是公认的答案): 问题答案: CodePro Analytix有一个JUnit测试生成模块,听起来像它可以完成您想要的。请参阅《用户指南》。 [CoView]是价格合理