如何为 bean 自注册的服务编写测试
How to write a test for a service in which beans self-register
正确的 class 测试设置有问题。
我有以下服务结构
我的服务:
界面
public interface ColumnsFromTableService {
List<ColumnsDto> getTableColumnsFromSource(DataProvider dataProvider, String tableName);
DataProviderSourceType myDataProviderSourceType();
@Autowired
default void regMe(ColumnsFromTableFacade columnsFromTableFacade){
columnsFromTableFacade.register(myDataProviderSourceType(),this);
}
}
实现
@Service
@RequiredArgsConstructor
public class OracleColumnsFromTableServiceImpl implements ColumnsFromTableService {
private final DataProviderInsideDao dataProviderInsideDao;
@Override
public List<ColumnsDto> getTableColumnsFromSource(DataProvider dataProvider, String tableName) {
return dataProviderInsideDao.getColumnsByTableNameFromOracle(dataProvider, tableName);
}
@Override
public DataProviderSourceType myDataProviderSourceType() {
return DataProviderSourceType.ORACLE;
}
}
我的门面:
界面
public interface ColumnsFromTableFacade {
List<ColumnsDto> getTableColumnsFromSource(DataProvider dataProvider, String tableName);
void register(DataProviderSourceType dataProviderSourceType, ColumnsFromTableService columnsDataProviderService);
}
实现
@Service
public class ColumnsFromTableFacadeImpl implements ColumnsFromTableFacade {
private final Map<DataProviderSourceType, ColumnsFromTableService> implementationMap = new HashMap<>();
@Override
public List<ColumnsDto> getTableColumnsFromSource(DataProvider dataProvider, String tableName) {
ColumnsFromTableService columnsFromTableService = implementationMap.get(dataProvider.getSourceType());
return columnsFromTableService.getTableColumnsFromSource(dataProvider,tableName);
}
@Override
public void register(DataProviderSourceType dataProviderSourceType, ColumnsFromTableService columnsDataProviderService) {
implementationMap.put(dataProviderSourceType, columnsDataProviderService);
}
}
为了使用,我在需要的地方注入门面。
应用程序一切正常。创建 ColumnsFromTableService bean 时,Spring Boot 在接口中看到 @Autowired 注释,并在外观中注册服务。但是在测试这个门面的时候,我设置不正确
我的测试:
@ExtendWith(MockitoExtension.class)
public class EasyServiceTest {
@InjectMocks
TablesFromSourceFacadeImpl tablesFromSourceFacade;
@Test
void test(){
tablesFromSourceFacade.getAllTablesFromSource(new DataProvider());
}
}
当运行测试时,门面实例化成功。但是带有实现的集合是空的。
enter image description here
我正在使用
Junit 木星 - 5.7.1
Spring 启动 - 2.4.3
我决定粗暴一点
@ExtendWith(MockitoExtension.class)
public class EasyServiceTest {
TablesFromSourceFacadeImpl tablesFromSourceFacade;
@InjectMocks
OracleTablesFromSourceServiceImpl oracleTablesFromSourceService;
@InjectMocks
OracleColumnsFromTableServiceImpl oracleColumnsFromTableService;
@BeforeEach
void setUp() {
tablesFromSourceFacade = new TablesFromSourceFacadeImpl();
tablesFromSourceFacade.register(postgresTablesFromSourceService.myDataProviderSourceType(),
postgresTablesFromSourceService);
tablesFromSourceFacade.register(oracleTablesFromSourceService.myDataProviderSourceType(),
oracleTablesFromSourceService);
}
@Test
void test(){
tablesFromSourceFacade.getAllTablesFromSource(new DataProvider());
}
}
已更新
问题的第二个解决方案是提高 spring 的整个上下文或其中的一部分。但就我而言,这不起作用,因为服务分散在不同的包中,我将不得不提升整个上下文,这很重。
正确的 class 测试设置有问题。
我有以下服务结构
我的服务:
界面
public interface ColumnsFromTableService {
List<ColumnsDto> getTableColumnsFromSource(DataProvider dataProvider, String tableName);
DataProviderSourceType myDataProviderSourceType();
@Autowired
default void regMe(ColumnsFromTableFacade columnsFromTableFacade){
columnsFromTableFacade.register(myDataProviderSourceType(),this);
}
}
实现
@Service
@RequiredArgsConstructor
public class OracleColumnsFromTableServiceImpl implements ColumnsFromTableService {
private final DataProviderInsideDao dataProviderInsideDao;
@Override
public List<ColumnsDto> getTableColumnsFromSource(DataProvider dataProvider, String tableName) {
return dataProviderInsideDao.getColumnsByTableNameFromOracle(dataProvider, tableName);
}
@Override
public DataProviderSourceType myDataProviderSourceType() {
return DataProviderSourceType.ORACLE;
}
}
我的门面:
界面
public interface ColumnsFromTableFacade {
List<ColumnsDto> getTableColumnsFromSource(DataProvider dataProvider, String tableName);
void register(DataProviderSourceType dataProviderSourceType, ColumnsFromTableService columnsDataProviderService);
}
实现
@Service
public class ColumnsFromTableFacadeImpl implements ColumnsFromTableFacade {
private final Map<DataProviderSourceType, ColumnsFromTableService> implementationMap = new HashMap<>();
@Override
public List<ColumnsDto> getTableColumnsFromSource(DataProvider dataProvider, String tableName) {
ColumnsFromTableService columnsFromTableService = implementationMap.get(dataProvider.getSourceType());
return columnsFromTableService.getTableColumnsFromSource(dataProvider,tableName);
}
@Override
public void register(DataProviderSourceType dataProviderSourceType, ColumnsFromTableService columnsDataProviderService) {
implementationMap.put(dataProviderSourceType, columnsDataProviderService);
}
}
为了使用,我在需要的地方注入门面。
应用程序一切正常。创建 ColumnsFromTableService bean 时,Spring Boot 在接口中看到 @Autowired 注释,并在外观中注册服务。但是在测试这个门面的时候,我设置不正确
我的测试:
@ExtendWith(MockitoExtension.class)
public class EasyServiceTest {
@InjectMocks
TablesFromSourceFacadeImpl tablesFromSourceFacade;
@Test
void test(){
tablesFromSourceFacade.getAllTablesFromSource(new DataProvider());
}
}
当运行测试时,门面实例化成功。但是带有实现的集合是空的。
enter image description here
我正在使用 Junit 木星 - 5.7.1 Spring 启动 - 2.4.3
我决定粗暴一点
@ExtendWith(MockitoExtension.class)
public class EasyServiceTest {
TablesFromSourceFacadeImpl tablesFromSourceFacade;
@InjectMocks
OracleTablesFromSourceServiceImpl oracleTablesFromSourceService;
@InjectMocks
OracleColumnsFromTableServiceImpl oracleColumnsFromTableService;
@BeforeEach
void setUp() {
tablesFromSourceFacade = new TablesFromSourceFacadeImpl();
tablesFromSourceFacade.register(postgresTablesFromSourceService.myDataProviderSourceType(),
postgresTablesFromSourceService);
tablesFromSourceFacade.register(oracleTablesFromSourceService.myDataProviderSourceType(),
oracleTablesFromSourceService);
}
@Test
void test(){
tablesFromSourceFacade.getAllTablesFromSource(new DataProvider());
}
}
已更新
问题的第二个解决方案是提高 spring 的整个上下文或其中的一部分。但就我而言,这不起作用,因为服务分散在不同的包中,我将不得不提升整个上下文,这很重。