Java 模拟类的私有字段

Java 模拟类的私有字段,java,mockito,powermock,Java,Mockito,Powermock,我班上有以下字段 @Resource(name = "lobIdCancellationNodeMap") private Map<String, List<String>> lobIdCancellationNodeMap; 我不允许更改实现类虽然我同意其他用户的意见,即测试不面向公众的东西似乎是错误的,但我确实对“我不允许更改实现类”的情况表示同情 @Resource注释设计用于让应用程序在运行时注入实例。我建议您在运行时使用与应用程序相似的上下文设置测试。这样,该

我班上有以下字段

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

我不允许更改实现类

虽然我同意其他用户的意见,即测试不面向公众的东西似乎是错误的,但我确实对“我不允许更改实现类”的情况表示同情

@Resource注释设计用于让应用程序在运行时注入实例。我建议您在运行时使用与应用程序相似的上下文设置测试。这样,该类将被注入其资源


否则,您可能会使用反射将值设置为所需的值。

我已通过使用spring framework提供的ReflectionTestUtils类解决了此问题。使用此选项,您可以设置该类的任何字段,而不考虑其访问修饰符

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

使用公共访问器方法并模仿它怎么样?如果这还不能解决问题,那么您可能测试了错误的内容。如果字段是私有的,那么测试无论如何都不应该尝试访问它。测试应该验证对象面向公共的行为。如果它是私有的,您如何在代码中直接访问它?如果您可以使该字段受保护,那么您的单元测试可以在没有外部类访问的情况下设置它。我知道您不能更改实现,但出于测试目的的字段访问与更改API不同。
ReflectionTestUtils.setField(mapper, "lobIdCancellationNodeMap", lobIdCancellationNodeMap);