Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringBoot:ReflectionTestUtils.setFields是如何工作的?_Java_Spring_Spring Boot_Unit Testing_Junit - Fatal编程技术网

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;
}