测试代码:

@MybatisTest
@Rollback
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@RunWith(SpringRunner.class)
//@SpringBootTest
//@ImportAutoConfiguration({RibbonAutoConfiguration.class, FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class})
public class TrackingMapperTest {

    @Autowired
    private TrackingMapper mapper;

    @Test
    public void checkDeliveryJdIsInPhaseSet() {
        Set<Long> jdIds = mapper.selectAll().stream().map(Tracking::getDeliveryPositionId).collect(Collectors.toSet());
        List<JdPhase> list= mapper.selectByIdsAndPhase(jdIds, ImmutableSet.of(Phase.JOINING, Phase.GUARANTEE_PERIOD));
        System.out.println("Finish");
    }
}

期望通过@MybatisTest、@RunWith(SpringRunner.class)注解类实现基于Mapper的测试,但是在实际项目中发现单元测试运行一直卡在SpringContext加载过程,报错信息:
No qualifying bean of type ‘org.springframework.cloud.openfeign.FeignContext’ available

但是使用@SpringBootTest和@RunWith(SpringRunner.class)就能正常启动,在其他项目中使用第一种方案组合也可以正常启动,不出现FeignContext加载失败情况,于是本地测试实践排查了一下原因

原因:
由于启动类SpringApplication.class加入了Component(“com.xxx.xx.*”)导致了该目录下所有bean都会被强制加载,而不是仅仅加载Mybatis启动所需要的Bean。
而SpringRunner仅加载显式注册的SpringBean,而对于部分通过构造器注入的未标记bean注册不能自动识别注册,但是SpringBootTest可以,所以对于这部分Bean,要么使用SpringBootTest完全模拟Spring环境自动加载,要不然就自定义Bean注册到Spring上下文,再通过SpringRunner启动即可

@SpringRunner&@MybatisTest启动失败解决方案:

  1. 限制启动类的CommponentScan扫描范围或者直接注释掉
  2. 对于未识别的类进行手动自定义注入
  3. 使用SpringBootTest+RunWith(SpringRunner.class)搭配启动

结果

以上仅为个人观点,仅供参考,如有差错,感谢指出!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐