如何为bean自注册的服务编写测试



测试的正确类设置存在问题。

我有以下服务结构

我的服务:

接口

public interface ColumnsFromTableService {
List<ColumnsDto> getTableColumnsFromSource(DataProvider dataProvider, String tableName);
DataProviderSourceType  myDataProviderSourceType();
@Autowired
default void regMe(ColumnsFromTableFacade columnsFromTableFacade){
columnsFromTableFacade.register(myDataProviderSourceType(),this);
}
}

Impl

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

Impl

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

为了使用,我在需要的地方注入了立面。

应用程序中一切正常。在创建ColumnsFromTableServicebean时,SpringBoot会在接口中看到@Autowired注释,并在facade中注册服务。但在测试这个外观时,我无法正确设置它。

我的测试:

@ExtendWith(MockitoExtension.class)
public class EasyServiceTest {
@InjectMocks
TablesFromSourceFacadeImpl tablesFromSourceFacade;
@Test
void test(){       
tablesFromSourceFacade.getAllTablesFromSource(new DataProvider());
}
}

运行测试时,facade已成功实例化。但是带有实现的集合是空的。

在此处输入图像描述

我正在使用木星-5.7.1弹簧套-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());
}
}

更新的

这个问题的第二个解决方案是提出春季的整个背景或部分背景。但就我而言,这并不奏效,因为服务分散在不同的包中,我必须提出整个背景,这很重。

最新更新