2014-03-19 61 views
1

我有以下领域在我班上惩戒类

@Resource(name = "lobIdCancellationNodeMap") 
private Map<String, List<String>> lobIdCancellationNodeMap; 

这条线,我们直接访问这个领域lobIdCancellationNodeMap后的私人领域

我不能为这个使用设定值Mockito,并且没有可以设置这个值的construtor。

这是它是如何使用

lobIdCancellationNodeMap.get(lobId) 

我不允许改变实现类

+1

如何使用公共存取方法并嘲笑它?如果这不能削减它,你可能会测试错误的东西。 – CompuChip

+5

如果该字段是私人的,那么测试不应该尝试访问它。测试应该验证对象的面向公众的行为。 – David

+0

如果你的代码是私人的,你是如何直接访问它的? – LaurentG

回答

1

我已经通过使用ReflectionTestUtils解决了这个问题。使用这个类可以设置类的任何字段,而不管它的访问修饰符如何。

ReflectionTestUtils.setField(mapper, "lobIdCancellationNodeMap", lobIdCancellationNodeMap); 
2

虽然我与其他用户的笔记,这似乎是错误的被测试的东西,是不同意面向公众,我确实对“我不能改变实施阶级”的情况表示同情。

@Resource注释旨在用于让应用程序在运行时注入实例。我建议你在运行时使用类似于应用程序的上下文来设置你的测试。这样,这个类将注入其资源。

如果失败,您可以使用Reflection将值设置为您需要的值。

+0

如果你可以让字段保护,那么你的单元测试可以在没有外部类访问的情况下进行设置。我知道你不能改变实现,但为了测试的目的访问字段与改变API不一样。 –