是否可以进行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;
}
}
}