Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Junit和SpringWebSocket——每次测试后,我都会遇到一个奇怪的异常_Java_Spring_Junit_Websocket_Spring Websocket - Fatal编程技术网

Java Junit和SpringWebSocket——每次测试后,我都会遇到一个奇怪的异常

Java Junit和SpringWebSocket——每次测试后,我都会遇到一个奇怪的异常,java,spring,junit,websocket,spring-websocket,Java,Spring,Junit,Websocket,Spring Websocket,当jUnit测试结束时,我遇到以下异常: 7 May 2014 18:06:29 INFO GenericApplicationContext - Closing org.springframework.context.support.GenericApplicationContext@7b0133c2: startup date [Tue May 27 18:06:09 IDT 2014]; root of context hierarchy 27 May 2014 18:06:

当jUnit测试结束时,我遇到以下异常:

7 May 2014 18:06:29  INFO GenericApplicationContext - Closing  org.springframework.context.support.GenericApplicationContext@7b0133c2: startup date [Tue May 27      18:06:09 IDT 2014]; root of context hierarchy
27 May 2014 18:06:29  INFO DefaultLifecycleProcessor - Stopping beans in phase 2147483647
27 May 2014 18:06:29  INFO NettyTcpClient - CLOSED: [id: 0x09b0bb52, /127.0.0.1:56869 :>  /127.0.0.1:61613]
27 May 2014 18:06:31 ERROR StompBrokerRelayMessageHandler - Error while shutting down TCP client
java.util.concurrent.TimeoutException
at org.springframework.messaging.tcp.reactor.AbstractPromiseToListenableFutureAdapter.get(AbstractPromiseToListenableFutureAdapter.java:84)
at org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler.stopInternal(StompBrokerRelayMessageHandler.java:377)
at org.springframework.messaging.simp.broker.AbstractBrokerMessageHandler.stop(AbstractBrokerMessageHandler.java:150)
at org.springframework.messaging.simp.broker.AbstractBrokerMessageHandler.stop(AbstractBrokerMessageHandler.java:164)
at org.springframework.context.support.DefaultLifecycleProcessor.doStop(DefaultLifecycleProcessor.java:229)
at org.springframework.context.support.DefaultLifecycleProcessor.access$300(DefaultLifecycleProcessor.java:51)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.stop(DefaultLifecycleProcessor.java:363)
at org.springframework.context.support.DefaultLifecycleProcessor.stopBeans(DefaultLifecycleProcessor.java:202)
at org.springframework.context.support.DefaultLifecycleProcessor.onClose(DefaultLifecycleProcessor.java:118)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:888)
at org.springframework.context.support.AbstractApplicationContext$1.run(AbstractApplicationContext.java:809)
27 May 2014 18:06:31  INFO ThreadPoolTaskExecutor - Shutting down ExecutorService 'brokerChannelExecutor'
27 May 2014 18:06:31  INFO ThreadPoolTaskScheduler - Shutting down ExecutorService 'messageBrokerSockJsTaskScheduler'
27 May 2014 18:06:31  INFO ThreadPoolTaskExecutor - Shutting down ExecutorService 'clientOutboundChannelExecutor'
27 May 2014 18:06:31  INFO ThreadPoolTaskExecutor - Shutting down ExecutorService 'clientInboundChannelExecutor'
27 May 2014 18:06:31  INFO EhCacheManagerFactoryBean - Shutting down EhCache CacheManager
27 May 2014 18:06:31  INFO LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default'
27 May 2014 18:06:31  INFO DefaultContextLoadTimeWeaver - Removing all registered transformers for class loader: sun.misc.Launcher$AppClassLoader
有没有办法防止这种情况

另外,测试是成功的,但我真的很讨厌看到堆栈跟踪

编辑- 我的测试班:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/application-context.xml" })
public class EmptyTest{
  /**
  * Test (empty)
  */
  @Test()
  public void emptyTest() {

  assertTrue(true);

  }
}

这是我的代理配置文件:

@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {

config.enableStompBrokerRelay(
                  "/topic",
                  "/queue/");

config.setApplicationDestinationPrefixes("/app");
}


@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {

registry.addEndpoint(
             "/wsdemo").withSockJS();
}

}

在我看来,您有一些选择,具体取决于您现在想要在测试中实现什么,以及您将来可能想要做什么

1) 如果测试根本不需要websocket配置,请将其更改为指向不包含
WebSocketConfig
的自定义上下文配置

2) 如果您的测试需要websocket配置,但不需要代理中继(我不明白为什么在测试中需要它),您可以添加另一个使用
registry.enableSimpleBroker(“/topic”,“/queue/”)
而不是
enableStomBrokerRelay
的测试配置。然后将没有到代理的TCP连接。这种方法的明显缺点是没有测试实际的配置,并且复制了目标前缀

3) 为测试运行嵌入式STOMP代理。我并不是100%肯定有这样的事情存在——我知道ActiveMQ支持STOMP和对的一些支持,但我还没有用STOMP尝试过。如果可能的话,这种方法的优点是您的测试将测试非常接近真实代码的东西

4) 您可以定制STOMP代理中继,使您能够完全控制应用程序从代理接收的内容。您可以通过添加一个扩展的配置类来覆盖
stompBrokerRelayMessageHandler()
方法,自定义管理到中继代理的连接的。例如,您可以将它使用的TCP客户端设置为您自己的
TcpOperations
实现。下面是一个示例TCP客户端,它什么也不做,即使处理程序认为它已连接,但无法接收或发送消息

@Override
public AbstractBrokerMessageHandler stompBrokerRelayMessageHandler() {
    AbstractBrokerMessageHandler handler = super.stompBrokerRelayMessageHandler();

    if (handler instanceof StompBrokerRelayMessageHandler) {
        StompBrokerRelayMessageHandler stompHandler = (StompBrokerRelayMessageHandler) handler;
        stompHandler.setTcpClient(new TcpOperations<byte[]>() {
            @Override
            public ListenableFuture<Void> connect(TcpConnectionHandler<byte[]> connectionHandler) {
                return new CompletedListenableFuture<>(null);
            }

            @Override
            public ListenableFuture<Void> connect(TcpConnectionHandler<byte[]> connectionHandler, ReconnectStrategy reconnectStrategy) {
                return new CompletedListenableFuture<>(null);
            }

            @Override
            public ListenableFuture<Void> shutdown() {
                return new CompletedListenableFuture<>(null);
            }
        });
    }

    return handler;
}
@覆盖
公共抽象BrokerMessageHandler stompBrokerRelayMessageHandler(){
AbstractBrokerMessageHandler=super.stompBrokerRelayMessageHandler();
if(StompBrokerRelayMessageHandler的处理程序实例){
StompBrokerRelayMessageHandler=(StompBrokerRelayMessageHandler)处理程序;
setTcpClient(新的TcpOperations()){
@凌驾
public ListenableFuture connect(TcpConnectionHandler connectionHandler){
返回新的CompletedListenableFuture(空);
}
@凌驾
public ListenableFuture connect(TcpConnectionHandler connectionHandler,重新连接策略重新连接策略){
返回新的CompletedListenableFuture(空);
}
@凌驾
公开上市未来关闭(){
返回新的CompletedListenableFuture(空);
}
});
}
返回处理程序;
}
请注意,
CompletedListenableFuture
只是在构造之后完成的
ListenableFuture
的一个实现,它会立即调用传递给
addCallback
的任何回调,并将值传递给构造函数


这里的要点是,您可以轻松定制代理中继组件的确切行为,以便在测试中更好地控制它们。我不知道有什么内置的支持可以使这种测试更容易,但是websocket支持仍然是非常新的。我建议您看看Rossen Stoyanchev的优秀示例项目,如果您还没有这样做的话,因为它包括几个如何在不同级别测试websocket配置的示例(只有一个控制器,加载完整的上下文,运行嵌入式服务器,…)。希望这也有助于您决定如何测试应用程序,以及您可能需要定制什么来进行测试。

您的单元测试在做什么?它是否连接到实际的经纪人?如果是,您使用的是哪家代理?看起来TCP客户端(用于websocket消息的代理中继)可能未正确断开连接。我的测试与代理无关,即junit关闭后,空测试将导致此异常…您希望测试连接到实际的代理吗?如果没有,您可以添加一些测试配置来连接嵌入式或模拟代理。你是如何运行你的测试的?您使用的是
SpringJUnit4ClassRunner
?你能为一个简单的示例测试发布代码吗?Adnerschuller-见我的编辑:)谢谢你的回复。我喜欢备选方案1和2。备选方案#1的问题-我不确定如何在运行测试时禁用websocket配置\在生产环境中运行时启用websocket配置。备选方案#2的问题是,我不太确定如何设置用于测试的simpleBroker和用于生产的stompbroker?我相信您应该指定
,而不是(或除了?)测试类上
上下文配置
注释中的
位置
。不幸的是,我不太熟悉这一点,因为我在我的项目中使用了SpringBoot,但是SpringWebSocket公文包似乎在注释中使用了配置类而不是XML文件。