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配置。