在Spring集成测试中触发ContextRefreshedEvent太早

时间:2018-09-06 07:24:50

标签: java spring spring-boot event-handling spring-boot-test

我想测试类似Example的类,该类处理ContextRefreshedEvent并在处理程序方法中连接到服务器:

public class Example {

    @EventListener
    public void onApplicationEvent(ContextRefreshedEvent event) {
        startWebSocketConnection();
    }

    // ...
}

但是在集成测试中,应用程序上下文是在Web套接字服务器启动并运行之前构建的,因此我得到一个异常,说明连接失败(在这种情况下为java.net.ConnectException: Connection refused: no further information)。

测试如下:

@ExtendWith(SpringExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@SpringBootTest
public class WebSocketDataSourceTest {

    @Autowired 
    private Example example;

    @Autowired
    private WebSocketServer server; // created too late

    // ...
}

是否可以抑制ContextRefreshedEvent或推迟应用程序上下文的创建,以便Web套接字服务器可以在之前启动?还是有其他解决方案?

1 个答案:

答案 0 :(得分:1)

似乎没有办法抑制Spring框架触发的事件或推迟应用程序上下文的创建。所以我想出了以下解决方法:

tables

测试手动触发事件处理程序。

ar_1.forEach((findNum) => {
  const foundTable = tables.find(([num]) => num === findNum);
  div.append(
    '<img src="xxx"><span>' + foundTable[1] + '</span>'
  )
});