我有一个名为
ApplicationRunner
的 RefAppRunner
实现,它执行一些逻辑。
我想编写一个基于 SpringBoot 的单元测试,以验证
ApplicationRunner
的行为是否符合基于它获得的 ApplicationArguments
的预期。
该实现还有一些
@Autowired
字段。
在 Spring Boot 应用程序中对此类组件进行单元测试的推荐方法是什么?
我希望所有基于 Spring 的上下文都被初始化,就像应用程序正确启动一样,但我想提供
ApplicationArguments
的变体
有推荐的方法来编写此类测试吗?
我已经注释掉了
@SpringBootTest
,因为如果启用它,则将在调用 ApplicationRunner
测试方法之前调用自定义 run
..这意味着无法控制传递给 impl 的值。
这是我当前在 Spring Boot 项目中的 Java 单元测试:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.DefaultApplicationArguments;
import org.springframework.boot.test.context.SpringBootTest;
//@SpringBootTest
public class RefAppRunnerTest
{
@Autowired
private RefAppRunner refAppRunner;
@Test
public void run() throws Exception {
refAppRunner.run(new DefaultApplicationArguments(new String[]{}));
}
}
RefAppRunner
是一个 ApplicationRunner
实现:
@Component
public class RefAppRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
// ..
}
}
但我收到此错误:
java.lang.NullPointerException: Cannot invoke "com.apps.referenceapp.RefAppRunner.run(org.springframework.boot.ApplicationArguments)" because "this.refAppRunner" is null
at com.apps.referenceapp.RefAppRunnerTest.run(RefAppRunnerTest.java:16)
ApplicationContextRunner
(Spring Docs)的一个很好的用例:
public class AppRunnerTest {
@Test
public void testAppRunner() {
ApplicationContextRunner contextRunner = new ApplicationContextRunner();
contextRunner
.withUserConfiguration(RefAppRunner.class)
.run(context -> {
Assertions.assertTrue(context.containsBean("refAppRunner"));
RefAppRunner myAppRunner = (MyAppRunner) context.getBean("refAppRunner");
myAppRunner.run(new DefaultApplicationArguments());
});
}
}