【问题标题】:How to test a class which has properties being set using spring @values annotation?如何测试使用 spring @values 注释设置属性的类?
【发布时间】:2012-11-27 22:06:04
【问题描述】:

我有一个如下所示的课程

public class Abcd{

private  @Value("${username}")
String username;

private @Value("${password}")
String password;

public Abcd(){
   ServiceService serv = new ServiceService();
   Service port = serv.getServicePort();
   BindingProvider bp = (BindingProvider) port;
   bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
   bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);

}

public void getSomeValueMethod(){
....
}

那么我该如何为此编写测试呢?当我从属性文件中读取值时,当我尝试调用构造函数进行测试时,由于用户名和密码为空,我得到一个空指针异常并且测试失败。有什么办法可以克服这个问题并成功测试吗?如何在调用构造函数之前设置这些带注释的值?

【问题讨论】:

  • 你是从 spring 实例化 Abcd 还是在做一个新的 Abcd() ?你需要让 spring 给你这个对象的一个​​实例,让它自动注入依赖项。
  • 我正在做新的 Abcd()。所以在实例化之前我没有设置任何值,所以测试失败。
  • 我相信只有最新版本的 spring 或者至少高于 3.1 才能让你这样做。让 Spring 创建一个对象的实例(并因此在其中注入所需的所有依赖项)在你的 spring 配置文件中引用一个 bean 并要求它给你一个实例(例如link)或使用 junit 和 spring测试环境,在你的测试类中创建一个字段,并用@autowired注解
  • 在构造函数中完成所有工作的单独类看起来很奇怪。它试图绑定什么?.....upd:抱歉我看错了——它创建了一个单独的 BindingProvider 实例。

标签: spring testing constructor annotations mocking


【解决方案1】:

就像 Spring 注入的所有东西一样:通过在单元测试中自己注入它们:

public class Abcd{

    private String username;
    private String password;

    public Abcd(@Value("${username}") userName, @Value("${password}") String password) {
        ...
    }
    ...
}

在你的单元测试中:

Abcd abcd = new Abcd("someUserName", "somePassword");

请记住,依赖注入的主要目标是能够在单元测试中手动注入虚假或模拟依赖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2017-01-15
    • 2015-01-11
    • 2020-02-07
    • 2012-04-04
    相关资源
    最近更新 更多