Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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 测试中存储库的Spring引导注入映射为空_Java_Spring_Junit_Dependency Injection - Fatal编程技术网

Java 测试中存储库的Spring引导注入映射为空

Java 测试中存储库的Spring引导注入映射为空,java,spring,junit,dependency-injection,Java,Spring,Junit,Dependency Injection,在我的@RestController中,我正在注入一个@Repositories的映射,这些映射都是从数据库repository扩展而来的。参见构造器: @Autowired public DatasetController(Map<String, DataBaseRepository<?, ?>> reps) { this.repositories = reps; } 在我的测试中,DatasetController中的.repositories为null 我

在我的
@RestController
中,我正在注入一个
@Repositories
的映射,这些映射都是从
数据库repository
扩展而来的。参见构造器:

@Autowired
public DatasetController(Map<String, DataBaseRepository<?, ?>> reps) {
    this.repositories = reps;
}
在我的测试中,
DatasetController
中的.repositories为null

我做错了什么,或者在单元测试中这是不可能的?
提前谢谢

您必须使用DailyTAVGRepositories映射显式实例化DatasetController

DatasetController datasetController = new DatasetController(mapWithRepositories);

您还可以尝试自动连接DailyTAVGRepository,而不是模拟它。

您必须使用DailyTAVGRepositories映射显式实例化DatasetController

DatasetController datasetController = new DatasetController(mapWithRepositories);

您还可以尝试自动连接DailyTAVGRepository而不是模拟它。

您可以使用
@Before
创建控制器,然后让mockito为您注入模拟

@Before
public void init() {
    Map<String, DataBaseRepository> repos = new HashMap<>(); //you can leave this empty or add in a bunch of mocks of your own
    datasetController = spy(new DatasetController(repos));
    MockitoAnnotations.initMocks(this);

    //add your mocked repos to the repos map as needed after mocks are initialized
}
@之前
公共void init(){
Map repos=new HashMap();//您可以将其保留为空,也可以添加一组自己的模拟
datasetController=spy(新datasetController(repos));
initMocks(this);
//初始化模拟后,根据需要将模拟的回购添加到回购映射中
}

您可以使用
@Before
创建控制器,然后让mockito为您注入mock

@Before
public void init() {
    Map<String, DataBaseRepository> repos = new HashMap<>(); //you can leave this empty or add in a bunch of mocks of your own
    datasetController = spy(new DatasetController(repos));
    MockitoAnnotations.initMocks(this);

    //add your mocked repos to the repos map as needed after mocks are initialized
}
@之前
公共void init(){
Map repos=new HashMap();//您可以将其保留为空,也可以添加一组自己的模拟
datasetController=spy(新datasetController(repos));
initMocks(this);
//初始化模拟后,根据需要将模拟的回购添加到回购映射中
}

constructor参数需要一个映射,而不是直接使用存储库,因此您可以尝试使用mock创建一个映射,并手动创建对象=
DatasetController DatasetController=newdatasetcontroller(yourmapcainingmocks)
DatasetController的优点在于它有一个构造函数。因此,您可以在测试中手动构建它,而不是使用自动配置进行测试。@eamonsculion在实际应用中,我从不提供/构建此映射。它是由java依赖项注入自动创建的。字符串是类名,DataBaseRepository是该类名的适当存储库。为什么它在应用程序中工作而在测试中不工作?构造函数参数需要一个映射,而不是直接使用存储库,因此您可以尝试使用模拟创建映射,并手动创建对象=
DatasetController DatasetController=new DatasetController(yourMapContainingMocks)
DatasetController的优点在于它有一个构造函数。因此,您可以在测试中手动构建它,而不是使用自动配置进行测试。@eamonsculion在实际应用中,我从不提供/构建此映射。它是由java依赖项注入自动创建的。字符串是类名,DataBaseRepository是该类名的适当存储库。为什么它可以在应用程序中工作,而不能在测试中工作?所以没有选项可以在测试中自动创建和自动连接该映射?在实际应用中,我从不提供/构建此地图。它是由java依赖项注入自动创建的。字符串是类名,DataBaseRepository是该类名的适当存储库。为什么它在应用中有效,但在测试中无效。有一个选择。但是,这违反了单元测试的约束,单元测试不应启动Spring应用程序实例和其他服务。2.它在应用程序中工作,因为应用程序是Spring应用程序。如果您想在测试中使用Spring,您可以使用
@RunWith(SpringRunner.class)
,并提供专门用于测试的Spring配置。因此,没有选项在测试中自动创建和自动连接该映射?在实际应用中,我从不提供/构建此地图。它是由java依赖项注入自动创建的。字符串是类名,DataBaseRepository是该类名的适当存储库。为什么它在应用中有效,但在测试中无效。有一个选择。但是,这违反了单元测试的约束,单元测试不应启动Spring应用程序实例和其他服务。2.它在应用程序中工作,因为应用程序是Spring应用程序。如果想在测试中使用Spring,可以使用
@RunWith(SpringRunner.class)
并提供专门用于测试的Spring配置。