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

时间:2015-12-31 14:10:09

标签: spring-boot integration-testing springjunit4classrunner

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

  • fooApp
  • barApp
  • 测试

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

public ArrayList<Book> returnListOfBooks()
{
    Collections.sort(listOfBooks);
    // could print them, also, if you wish 
    return listOfBooks; 
}

集成测试的一个例子

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

1 个答案:

答案 0 :(得分:1)

给定两个包com.foo.module1和com.foo.module2,您必须为每个包创建一个Configuration类。 例如,对于module1:

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

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

 SET PATH=C:\Program Files\Nodejs;%PATH%

那将使用Config1启动Spring,它只在bean的包中搜索(@ComponentScan包含在@SpringBootApplication中)。

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

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

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