SpringBootTest如何复用主程序Bean及传递启动参数?
问题1:测试类调用main方法后无法获取主程序的Bean数据
直接调用ClevertechTestTaskApplication.main()会启动全新的Spring容器,和测试用的容器完全独立。测试类里@Autowired的ItemsDAO是测试容器的实例,而main方法操作的是新容器里的ItemsDAO,自然拿不到数据。
解决思路:把main方法中的业务逻辑抽离到独立组件,复用测试上下文的Bean:
- 新建业务处理类,封装参数解析和DAO操作逻辑:
@Service public class DataProcessingService { private final ItemsDAO itemsDAO; // 构造注入,确保复用同一个DAO实例 public DataProcessingService(ItemsDAO itemsDAO) { this.itemsDAO = itemsDAO; } public void processArgs(String[] args) { // 这里放原来main方法里处理参数、操作ItemsDAO的逻辑 // 例如解析"3-1"这类参数,往itemsDAO中添加数据 } }
- 修改主类,通过容器获取Service执行逻辑:
@SpringBootApplication public class ClevertechTestTaskApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(ClevertechTestTaskApplication.class, args); DataProcessingService service = context.getBean(DataProcessingService.class); service.processArgs(args); } }
- 测试类直接注入Service,调用业务方法:
@SpringBootTest class EntryData1 { @Autowired private ItemsDAO itemsDAO; @Autowired private DataProcessingService dataProcessingService; @Test void contextLoads() { dataProcessingService.processArgs(new String[]{"3-1","4-2"}); System.out.println(itemsDAO.getList()); // 现在能获取到数据 } }
问题2:@SpringBootTest的args参数无法获取
@SpringBootTest(args = {...})的参数是传递给Spring容器的,不会直接传入main方法(测试时main方法不会被执行)。要获取这些参数,需通过ApplicationArguments或Environment:
方式1:测试类中直接获取参数
@SpringBootTest(args = {"1-3","4-2"}) class EntryData1 { @Autowired private ApplicationArguments appArgs; @Autowired private DataProcessingService dataProcessingService; @Autowired private ItemsDAO itemsDAO; @Test void contextLoads() { // 获取传入的原始参数数组 dataProcessingService.processArgs(appArgs.getSourceArgs()); System.out.println(itemsDAO.getList()); } }
方式2:启动时自动处理参数
如果需要在应用启动时自动处理参数,实现ApplicationRunner或CommandLineRunner接口:
@Component public class StartupProcessor implements ApplicationRunner { private final DataProcessingService dataProcessingService; public StartupProcessor(DataProcessingService dataProcessingService) { this.dataProcessingService = dataProcessingService; } @Override public void run(ApplicationArguments args) throws Exception { // 启动时自动处理参数 dataProcessingService.processArgs(args.getSourceArgs()); } }
此时测试类无需手动调用processArgs,容器启动时会自动执行参数处理逻辑。
内容的提问来源于stack exchange,提问作者Andrei Kernazhytski
相关产品推荐
相关产品推荐

