使用JUnit进行单元测试

时间:2012-03-04 11:13:16

标签: java junit

据我了解,测试私有方法的正确方法是通过反射?因此,如果我们通过反射测试方法,我们需要创建类的实例,获取方法,调用它等等。但是,如果我们创建的类使用来自其他对象的数据,如果没有正确的先前生成的对象,则返回null /为null,我们该怎么办?

谢谢

3 个答案:

答案 0 :(得分:4)

我个人认为你应该避免在私有方法上编写测试。对我使用反射是一种设计气味 - 理想情况下,您应该只针对类中公开的公共接口编写测试。

如果您觉得需要测试私有方法,那么这表明您应该执行以下操作之一:

  • 认识到该方法确实应该是公共接口的一部分并公开
  • 针对间接测试私有方法的类的一些现有公共方法编写测试
  • 编写一个新的公共方法,公开您要测试的行为
  • 将行为重构为另一个可以测试的类(感谢Tom提供额外的想法!)

答案 1 :(得分:3)

  

据我了解,测试私有方法的正确方法是通过   反射?

这是唯一的方法(如果您只测试私有方法,而不是其他调用私有方法的公共方法),因为您无法从类外部访问私有方法(除了反射)。我通常不会为私有方法编写单独的测试,但它可能很有用。

  

如果我们创建的类使用来自其他对象的数据,我们该怎么办?   如果没有先前正确的,则返回null /为null   对象。

在单元测试中,您可以使用模拟库(例如Mockitosome other“模拟”外部依赖项,或者编写实现依赖项接口的匿名或单独的模拟类。我们的想法是为外部依赖项定义一些确切的行为,因此它们的行为不会影响实际类的测试。如果包含引用的字段是私有的,则需要使用反射将对象注入其中。

在集成测试中,您使用外部依赖项的实际实现。

答案 2 :(得分:1)

您可以使用该类的现有实例(例如,您已经测试过公共方法的实例)。

现在只需调用该实例的私有方法(通过反射找到),该方法可能必须包含所有“先前制作的”对象。