在单元测试中测试私有组件

时间:2015-11-12 12:26:27

标签: java unit-testing junit

所以我有一个这样的课程:

public class Person {
   private List<String> list = new ArrayList<String>();

   public addPerson(String s) {
        this.list.add(s);   
   }
}

public class TestPerson extends TestCase {
     private Person person;

     public testAddPerson() {
        this.person.addPerson("John");
     }    
}

我的问题是如何测试列表中添加了John。 我喜欢做一些测试,比如list.size() == 1list.get(0).equals("John")

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

您可以use Reflection测试私有变量。

但这可能不是一个好主意。建议通过公共接口测试私有属性。

答案 1 :(得分:0)

对于这个代码测试毫无意义,它实际上会测试列表实现是否会执行它应该执行的操作,而这不应该是测试的一部分。

问题是 - 您的列表在哪里使用,对它的任何公共访问权限,以及预期的行为。这是你应该测试的。

总的来说,这听起来像测试之后,你试图为了测试而不是为了验证而添加测试。

答案 2 :(得分:0)

这个名为shazamcrest的工具非常有用。它将实际和预期的对象序列化为json并进行String比较。您不必修改生产代码(不需要注释,不需要getter,字段可以是私有的)。

assertThat(actualPerson, sameBeanAs(expectedPerson));

它会抛出ComparisonFailure,因此您可以获得非常好的诊断:

enter image description here