如何为 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 的整个上下文或其中的一部分。但就我而言,这不起作用,因为服务分散在不同的包中,我将不得不提升整个上下文,这很重。