【问题标题】:How to test multiple Spring Boot applications in one test?如何在一次测试中测试多个 Spring Boot 应用程序?
【发布时间】:2016-04-05 11:51:11
【问题描述】:

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

父母

  • fooApp
  • barApp
  • 测试

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

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();
    }
}

还有一个集成测试的例子

public class IntegrationTest extends AbstractIntegrationTest {

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

}

【问题讨论】:

  • 从 Spring Boot Test 1.5.0 开始,您可以 supposedly 使用 @ContextConfiguration@SpringBootTest...您尝试过使用子上下文吗?
  • 你找到这个问题的答案了吗?我也有同样的情况。我的应用程序分为三个模块,它们有自己的应用程序上下文,我将公共 bean 导出到父上下文,这就是兄弟上下文可以共享 bean 的方式。问题是如何测试。我开始了解 ContextHierarchy 注释,但它会创建父子层次结构,并且无法创建兄弟上下文

标签: java spring-boot integration-testing springjunit4classrunner


【解决方案1】:

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

@SpringBootApplication public class Config1 {}

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

   new SpringApplicationBuilder(com.foo.module1.Config1.class)
     .showBanner(false)
     .run()

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

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

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

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

【讨论】:

  • 如果我的 spring-boot 应用程序位于不同的模块中,我如何在一个测试中获得它们?我将不得不使用知道这两个应用程序的第三个“集成测试模块”但是然后我将这两个应用程序的所有启动器都放在一个可能有副作用的类路径中(应用程序“A”采用应用程序“B”的行为只是因为现在一个 spring-data 启动器正在路上)。你是怎么处理的?
  • 我已经根据您的问题调整了答案。
  • 是的,我明白了。但这对我没有帮助。当然,我已经将我的“应用程序”拆分为“微服务”。这就是为什么我想对两个正在运行的应用程序进行集成测试,而这正是提出了“如何做”的问题的原因。首先。
  • 如果您想测试两个应用程序的相互作用或一个依赖于多个应用程序的系统,您不再处于单元测试级别。您在这里处理的是系统/集成测试,这意味着您的测试通过公共 API 像任何最终用户或其他外部系统一样访问系统。如果您在现代微服务架构上运行,您的接口将通过 HTTP 正常运行,并且您的测试框架将必须提供它。结帐 Selenium、Cucumber 或其他替代品。
  • 这个答案应该被删除,因为它显然没有回答如何测试的问题。
猜你喜欢
  • 1970-01-01
  • 2015-08-20
  • 2018-05-31
  • 2016-10-20
  • 2023-03-10
  • 2017-02-09
  • 2019-03-17
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多