Java SpringBoot:ReflectionTestUtils.setFields是如何工作的?
考虑以下代码: 服务Java SpringBoot:ReflectionTestUtils.setFields是如何工作的?,java,spring,spring-boot,unit-testing,junit,Java,Spring,Spring Boot,Unit Testing,Junit,考虑以下代码: 服务 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 exceptio
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(“,”,“),映射按预期进行。但我不知道发生了什么以及它是如何工作的。我参考了很多资料,但我找不到任何可靠的资料有人能告诉我什么是ReflectionTestUtils,它是如何工作的,以及何时使用它吗?
而不是做非常反的模式(如果你问我):
您始终可以通过构造函数注入它:
private final ModelMapper modelMapper;
class MyService(ModelMapper modelMapper) {
this.modelMapper = modelMapper;
}
当spring意识到MyService
是一个bean时,自动连接将为您实现。因此无需使用ReflectionTestUtils.setField
;这将在jdk-17中开始出现故障
由于您现在通过构造函数传递它,因此使用mock注入(例如)非常简单。而不是执行非常反模式的操作(如果您要求我): 您始终可以通过构造函数注入它:
private final ModelMapper modelMapper;
class MyService(ModelMapper modelMapper) {
this.modelMapper = modelMapper;
}
当spring意识到MyService
是一个bean时,自动连接将为您实现。因此无需使用ReflectionTestUtils.setField
;这将在jdk-17中开始出现故障
由于您现在通过构造函数传递它,因此使用模拟的注入就很简单。它在封面下使用反射API来设置对象字段的值 关于何时使用,已提供了一些信息: 您可以在需要的测试场景中使用这些方法 更改常量的值,设置非公共字段,调用 非公共setter方法,或调用非公共配置或 为用例测试应用程序代码时的生命周期回调方法 例如:
- ORM框架(如JPA和Hibernate)允许私有或 受保护的字段访问,而不是 域实体中的属性
- Spring对注释的支持(如@Autowired、@Inject和 @资源),为私有或受保护的 字段、setter方法和配置方法
- 使用诸如@PostConstruct和@PreDestroy之类的注释 生命周期回调方法
我通常使用它来设置一些虚拟域对象,这些对象是用于测试的JPA实体。由于它们的ID由Hibernate管理并具有良好的封装性,因此它们没有任何setter或构造函数来配置它们的ID值,因此需要使用它为它们的ID设置一些虚拟值。它在封面下使用反射API来设置对象字段的值 关于何时使用,已提供了一些信息: 您可以在需要的测试场景中使用这些方法 更改常量的值,设置非公共字段,调用 非公共setter方法,或调用非公共配置或 为用例测试应用程序代码时的生命周期回调方法 例如:
- ORM框架(如JPA和Hibernate)允许私有或 受保护的字段访问,而不是 域实体中的属性
- Spring对注释的支持(如@Autowired、@Inject和 @资源),为私有或受保护的 字段、setter方法和配置方法
- 使用诸如@PostConstruct和@PreDestroy之类的注释 生命周期回调方法
我通常使用它来设置一些虚拟域对象,这些对象是用于测试的JPA实体。由于它们的ID由Hibernate管理并具有良好的封装性,因此它们没有任何setter或构造函数来配置它们的ID值,因此需要使用它为它们的ID设置一些虚拟值。设置字段
“modelMapper”将目标服务上的设置为第三个参数(modelMapper
)的值。第一个参数是目标对象,第二个是字段名,第三个是要设置的值。它在某种程度上类似于注射。你可以查看它。简短回答,反射。设置字段
将目标服务
上的字段
设置为第三个参数(模型映射器
)的值。第一个参数是目标对象,第二个是字段名,第三个是要设置的值。它在某种程度上类似于注射。你可以查看它。简短的回答,反思。
private final ModelMapper modelMapper;
class MyService(ModelMapper modelMapper) {
this.modelMapper = modelMapper;
}