如何在一次测试中测试多个Spring Boot应用程序?

Kri*_*Aun 8 integration-testing spring-boot springjunit4classrunner

我有一个带有2个Spring Boot应用程序的多模块Maven项目

  • fooApp
  • barApp
  • 测试

如何设置一个测试,您可以在同一个进程中加载​​单独的Spring引导应用程序,每个应用程序都有自己的配置上下文.

public abstract class AbstractIntegrationTest {//test module

    protected FOO foo;
    protected BAR bar;

    @RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @IntegrationTest
    @Transactional
    @SpringApplicationConfiguration(classes = foo.Application.class)
    public class FOO {
        public MockMvc mockMvc;

        @Autowired
        public WebApplicationContext wac;

        @Before
        public void _0_setup() {
            MockitoAnnotations.initMocks(this);
            mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
            TestCase.assertNotNull(mockMvc);
        }

        public void login(String username) {
        }
    }

    @RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @IntegrationTest
    @Transactional
    @SpringApplicationConfiguration(classes = bar.Application.class)
    public class BAR {

        @Autowired
        public WebApplicationContext wac;

        public MockMvc restMvc;

        @Before
        public void _0_setup() {
            MockitoAnnotations.initMocks(this);
            restMvc = MockMvcBuilders.webAppContextSetup(wac).build();
            TestCase.assertNotNull(restMvc);
        }

        public void login(String username) {
        }
    }

    @Before
    public void _0_setup() {
        foo = new FOO();
        bar = new BAR();
    }
}
Run Code Online (Sandbox Code Playgroud)

并且是集成测试的一个例子

public class IntegrationTest extends AbstractIntegrationTest {

    @Test
    public void login() {
        foo.login("foologin");
        bar.login("barlogin");
    }

}
Run Code Online (Sandbox Code Playgroud)

rai*_*amp -1

给定两个包 com.foo.module1 和 com.foo.module2,您必须为每个包创建一个配置类。以模块 1 为例:

@SpringBootApplication public class Config1 {}
Run Code Online (Sandbox Code Playgroud)

如果您想仅使用单个包的 Spring bean 来运行应用程序,您可以使用 SpringApplicationBuilder 来实现。一个工作片段:

   new SpringApplicationBuilder(com.foo.module1.Config1.class)
     .showBanner(false)
     .run()
Run Code Online (Sandbox Code Playgroud)

这将使用 Config1 启动 Spring,它仅在其包中搜索(@ComponentScan 包含在 @SpringBootApplication 中)bean。

如果您想要运行完整的应用程序,例如同时运行所有两个模块,您必须在上层包 com.foo 中创建一个配置类。

在下面提到的情况下,由于像 spring-boot-starters 这样的库,在单个应用程序中运行两个模块可能会以不期望的方式相互干扰,我只能想到两种可能性:

  1. 使用 OSGi:这可能无法完全解决问题,并且可能会是一个相当复杂的设置或
  2. 将应用程序拆分为两个应用程序并创建接口。Spring Boot 对于微服务架构来说也是一个不错的选择。

  • 如果您想测试两个应用程序或依赖于多个应用程序的系统的相互作用,那么您不再处于单元测试级别。您正在处理系统/集成测试,这意味着您的测试像任何最终用户或其他外部系统一样通过公共 API 访问系统。如果您在现代微服务架构上运行,您的接口可能会通过 HTTP 运行,并且您的测试框架必须提供这一点。查看 Selenium、Cucumber 或替代品。 (5认同)
  • 这个答案应该被删除,因为它显然没有回答所述的如何测试的问题。 (2认同)