繁体   English   中英

SpringBoot:ReflectionTestUtils.setFields 是如何工作的?

[英]SpringBoot : How ReflectionTestUtils.setFields work?

考虑下面的代码:

服务

class MyService{

  @Autowired
  private ModelMapper modelMapper;


  void validate(){

       ResponseObject obj = modelMapper.map( REQUEST, ResponseObject.class);
 
       // In testing, if I am not mocking this Model Mapper, an exception will be thrown.

  }

}

测试

在 JUnit 测试用例中,我使用的是ReflectionTestUtils.setField("", "", "")而不是 mocking,并且映射按预期进行。 但我不知道发生了什么以及它是如何工作的。 我参考了许多来源,但我找不到任何可靠的资源。 谁能告诉我 ReflectionTestUtils 是什么,它是如何工作的,以及何时使用它?

@InjectMocks
MyService service;

private ModelMapper modelMapper;

@BeforeEach
void setup() {
    modelMapper = new ModelMapper();
    ReflectionTestUtils.setField( service, "modelMapper", modelMapper);

}

而不是做非常反模式(如果你问我):

@Autowired
private ModelMapper modelMapper;

你总是可以通过构造函数注入它:

private final ModelMapper modelMapper;

class MyService(ModelMapper modelMapper) {
    this.modelMapper = modelMapper;
}

MyService是 spring 知道的 bean 时,自动装配将为您发生。 所以不需要使用ReflectionTestUtils.setField 这将在jdk-17及更高版本中开始失败。


由于您现在通过构造函数传递它,因此使用模拟注入是微不足道的。

它在封面下使用反射 API 来设置 object 字段的值。

关于何时使用它, 文档已经提供了一些信息:

您可以在需要更改常量值、设置非公共字段、调用非公共 setter 方法或在测试应用程序代码时调用非公共配置或生命周期回调方法的测试场景中使用这些方法。用例如下:

  • ORM 框架(例如 JPA 和 Hibernate)允许私有或受保护的字段访问,而不是域实体中属性的公共设置方法。

  • Spring 对注解(如@Autowired、@Inject 和@Resource)的支持,为私有或受保护字段、setter 方法和配置方法提供依赖注入。

  • 对生命周期回调方法使用 @PostConstruct 和 @PreDestroy 等注解。

我通常用它来设置一些虚拟域对象,这些对象是 JPA 实体进行测试。 由于它们的 ID 由 Hibernate 管理并具有良好的封装性,因此它们没有任何 setter 或构造函数来配置其 ID 值,因此需要使用它来为其 ID 设置一些虚拟值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM