JUnit测试中Spring Boot应用程序的多个实例

时间:2018-11-15 09:51:51

标签: java spring spring-boot junit

是否可以进行Junit测试来启动应用程序的两个实例(在单独的线程上),以便可以测试弹性?

我遇到了使用以下命令启动应用程序的想法(Instantiate multiple spring boot apps in test):      新的SpringApplicationBuilder(Application.class).build()。run()

这一次可以很好地测试一个实例,当我在另一个实例中运行应用程序的第二个实例时却出现了问题。

两者的应用程序上下文似乎相互渗透,或者第二个可能完全覆盖第一个?我在测试中放置了一些断点,可以看到第一个上下文(nodeA),并从中获取一个在ID字段中具有正确值的bean(caretakerA)。在第二个上下文开始之后,如果我从两个上下文(nodeA和nodeC)中获得相同的bean,则ID属性将相同(caretakerC)。

在启动第二个上下文之前,监视表达式 BREAK 1 in code

启动第二上下文后,监视表达式 BREAK 2 in code

我已经在下面添加了测试代码,非常感谢您提出任何想法。

public class ResilienceTests
{
    @Test
    public void testResilience1() throws InterruptedException
    {    

        SpringApp nodeA = new SpringApp("caretakerA", "8181");
        nodeA.start();

        Thread.sleep(2000);
        SpringApp nodeC = new SpringApp("caretakerC", "8383");
        // Break point 1
        nodeC.start();
        // Break point 2
        ConfigurableApplicationContext contextA = nodeA.getContext();

        Thread.sleep(60000);
     }

    class SpringApp extends Thread
    {
        private ConfigurableApplicationContext context;
        private String propsName;
        private String port;

        public SpringApp(String name, String port)
        {
            super(name);
            this.propsName = name;
            this.port = port;
        }

       @Override
        public void run()
        {
            System.err.println("ENTERING RUN()");
            context = new SpringApplicationBuilder(Application.class)
                    .properties("spring.config.name:" + propsName,
                            "server.port:" + port,
                            "resilience.system.id:" + propsName)
                    .build()
                    .run();
            System.err.println("RETURNING FORM RUN()");
            System.err.println("CONTEXT IS " + context == null ? "NULL" : " NOT NULL");
        }

        public ConfigurableApplicationContext getContext()
        {
            return this.context;
        }
    }
}

0 个答案:

没有答案