如何为具有私有字段的类编写junit?

时间:2018-11-17 15:02:52

标签: java spring unit-testing junit

我有一个用于电子邮件验证的类。该类具有两个私有String字段,我从其中注入了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
}

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

2 个答案:

答案 0 :(得分:1)

如果您可以在不加载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指出的,最好为有效的电子邮件正则表达式设置一个静态的final字段,或者只通过一个库调用。

答案 1 :(得分: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.
    }