编写自定义 Spring ApplicationRunner 实现的单元测试并将 ApplicationArguments 的变体传递给它的最佳实践

问题描述 投票:0回答:1

我有一个名为

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)
java spring-boot unit-testing spring-boot-test
1个回答
0
投票

这是

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());
                });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.