【问题标题】:How to write junit for a class having private fields? [duplicate]如何为具有私有字段的类编写junit? [复制]
【发布时间】:2018-11-17 15:02:51
【问题描述】:

我有一个用于电子邮件验证的类。该类有两个私有字符串字段,我从application.properties 中注入了其中一个的值。

public class EmailValidation {

    private final String someString = "xyz"

    @Value("${regex}")
    private String emailRegex;

    // methods
}


public class EmailValidaitonTest {

   private final EmailValidation obj = new EmailValidation();

   //missing emailRegex
}

现在我必须为此编写一个单元测试。这个类没有依赖关系,所以我决定在EmailValidationTest 类中使用new 运算符作为类对象。现在,我可以访问字符串someString,但我不能拥有emailRegex 的值,因为它是由Spring 注入的。如何在测试类中设置它的值,并且我希望它的值与我的 application.properties 中的值相同。

【问题讨论】:

  • 使用构造函数注入代替字段注入。然后你可以在单元测试中传递你想要的任何正则表达式。如果你想创建一个集成测试并让 Spring 注入属性,那么不要使用new,而是在你的测试中自动装配 bean。文档是您的朋友。
  • 我为该正则表达式字段使用了构造函数注入,但现在如何在测试类中使用new 对其进行初始化,因为它现在需要传递一个字符串。我应该硬编码要传递的字符串吗? @JBNizet
  • 正如我所说,如果您希望 Spring 注入值,那么您的测试应该是 Spring 测试:docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…。但是首先将正则表达式外部化有什么意义呢?
  • 这个值永远不会改变,对吧?它不依赖于环境、配置文件或任何东西,对吧?所以没有理由把它外化。如果有充分的理由将其外部化,则意味着它可以具有任何值,由决定更改值的人决定,因此您的测试不应该关心属性中的具体值:它应该适用于任何值。
  • 另外,请注意,Spring Boot 支持的标准 hava bean 验证已经有一个电子邮件验证器,因此您正在重新发明轮子。

标签: java spring unit-testing junit


【解决方案1】:

您使用ReflectionTestUtils.setField 在测试用例中注入属性值。

 public class EmailValidationTest{
     private @InjectsMock EmailValidation validation; 
     private String emailRegexPattern = "^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$";

     @BeforeAll
     public void setUp(){
        ReflectionTestUtils.setField(validation, "emailRegex", emailRegexPattern);
     }

    //your test cases over here.
    }

【讨论】:

    【解决方案2】:

    如果您可以在不加载 Spring 上下文的情况下编写单元测试,那就更好了。您可以像这样设置您的课程:

    public class EmailValidation {
    
        private final String regex;
    
        @Autowired
        EmailValidation (@Value("${regex:}") String regex) {
            this.regex = regex;
        }
    }
    

    现在在您的测试类中,您可以通过构造函数参数实例化您的 emailValidation 类。

    private final EmailValidation obj = new EmailValidation("myRegex");
    

    正如@JB Nizet 指出的那样,最好为有效的电子邮件正则表达式设置一个静态最终字段,或者只是通过库调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多