StompSessionHandler в модульном тесте - не вызывая frameHandler - PullRequest
0 голосов
/ 23 апреля 2020

Я работаю через https://github.com/spring-guides/gs-messaging-stomp-websocket. У меня это работает и модульный тест проходит. Поэтому я решил изменить ввод и вывод подписанной функции с POJO на Strings. Я тоже изменил javascript. Это работает, когда я запускаю код.

Но модульный тест не проходит. Он вызывает getPayloadType и функцию, но frameHandler не вызывается.

Вот некоторые фрагменты кода

Проверка кода моих изменений в BOLD )

StompSessionHandler handler = new TestSessionHandler(failure) {

    @Override
    public void afterConnected(final StompSession session, StompHeaders connectedHeaders) {
        session.subscribe("/topic/greetings", new StompFrameHandler() {
            @Override
            public Type getPayloadType(StompHeaders headers) {
                System.out.println("DEBUG: into getPayloadType");
                **return String.class;**
            }

            @Override
            public void handleFrame(StompHeaders headers, Object payload) {
                System.out.println("DEBUG: into handleFrame");
                **String greeting = (String) payload.toString();**
                System.out.println("DEBUG: greeting is " + greeting);
                try {
                    assertEquals("Hello, Spring!", greeting);
                } catch (Throwable t) {
                    failure.set(t);
                } finally {
                    session.disconnect();
                    latch.countDown();
                }
            }
        });
        try {
            session.send("/app/hello", "Spring");
        } catch (Throwable t) {
            failure.set(t);
            latch.countDown();
        }
    }
};
System.out.println("DEBUG: calling connect");
this.stompClient.connect("ws://localhost:{port}/gs-guide-websocket", this.headers, handler, this.port);
System.out.println("DEBUG: back from connect");
if (latch.await(3, TimeUnit.SECONDS)) {
    if (failure.get() != null) {
        throw new AssertionError("", failure.get());
    }
}
else {
    fail("DEBUG: Greeting not received");
}

Код функции

@Controller
public class GreetingController {

    String storedMessage;

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public String greeting(String message) throws Exception {
        System.out.println("DEBUG: message is " + message);
        Thread.sleep(1000); // simulated delay
        System.out.println("DEBUG: about to return from greeting " + message);
        return "Hello, " + message + "!";
    }

    @GetMapping("/test")
    public String testThis(){

        return "test";
    }
}

И вывод mvn clean install (только бит ключа!)

2020-04-23 19:25:53.975  INFO 6711 --- [           main] c.e.m.GreetingIntegrationTests           : Started GreetingIntegrationTests in 8.004 seconds (JVM running for 10.983)
DEBUG: calling connect
2020-04-23 19:25:54.972  INFO 6711 --- [o-auto-1-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-04-23 19:25:54.979  INFO 6711 --- [o-auto-1-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-04-23 19:25:55.030  INFO 6711 --- [o-auto-1-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 49 ms
DEBUG: back from connect
DEBUG: message is Spring
DEBUG: about to return from greeting Spring
DEBUG: into getPayloadType
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 13.795 s <<< FAILURE! - in com.example.messagingstompwebsocket.GreetingIntegrationTests
[ERROR] getGreeting  Time elapsed: 4.226 s  <<< FAILURE!
org.opentest4j.AssertionFailedError: DEBUG: Greeting not received
    at com.example.messagingstompwebsocket.GreetingIntegrationTests.getGreeting(GreetingIntegrationTests.java:102)

Этот вопрос был поднят несколько лет go, но не был принят ответ. Любые идеи, что я сделал не так. Просто повторюсь, фактическое использование кода работает.

С уважением,

...