java 使用CommandLineRunner接口时,SpringBoot应用程序中的Junit测试失败

x6h2sr28  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(128)

有一个SpringBoot应用程序,带有SomeService和测试类来测试此服务。
我可以运行我的测试,一切正常,但只要我在我的主应用程序类MyApplication中使用CommandLineRunner接口(“implements CommandLineRunnner”),那么我所有的测试都开始失败。
问题是,当我试图在run方法中获取argument参数时,比如
args[0]**,那么我的测试开始失败。
我得到了这个错误:

Caused by: java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774)
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:755)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:319)

任何想法如何修复它并运行我的测试没有得到这个错误?
我的代码看起来像这样:

@SpringBootApplication
public class MyApplication implements CommandLineRunner  {

    @Autowired
    SomeService someService;

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        String file = args[0];
        someService.calculate(file);
    }

}

@Component
public class SomeService {

    // some methods here...
}

@SpringBootTest
public class SomeServiceTest {

    @Autowired
    private SomeService someService;

    @Test
    public void some_test() {
        someService.someFunction();
        //....
    }
}
roejwanj

roejwanj1#

这是因为CommandLineRunner#run()将在spring Boot 启动后执行。这里的输入参数args通常从用于运行spring Boot 应用程序的命令行传递。
当你执行@SpringBootTest时,默认情况下它的参数列表是空的,但是现在你的方法通过args[0]访问它的0索引项,这将导致IndexOutOfBoundsException发生,这反过来又导致SpringApplication#callRunner()抛出IllegalStateException
建议你把你的CommandLineRunner#run()设置为null安全,比如:

@Override
public void run(String... args) throws Exception {  
       if(args.length >= 1) {
            String file = args[0];
            someService.calculate(file);
       }
}

或者通过以下方式配置参数列表:

@SpringBootTest(args= {"foo","bar","baz"})
public class FooTest {

}

相关问题