簡體   English   中英

用 Spring 引導編寫的 WebSocket 信令服務器單元測試

[英]Unit testing a WebSocket Signaling server written in Spring Boot

我的任務是為以下信令服務器編寫單元測試用例。 任何人都可以幫助我解決至少一個成功運行的測試用例嗎? 我可以從那里撿起來。 目前,我對這項任務一無所知,我似乎對如何處理這個問題甚至連最微弱的想法都沒有。 請有人給我一些光。

這是 class:

@Component
public class SocketHandler extends TextWebSocketHandler {

List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();

@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws InterruptedException, IOException {

    for (WebSocketSession webSocketSession : sessions) {
        if (webSocketSession.isOpen() && !session.getId().equals(webSocketSession.getId())) {
            webSocketSession.sendMessage(message);
        }
    }
}

}

這就是我編寫單元測試用例的方式:

public class SocketHandlerTest {
@Mock
WebSocketSession webSocketSession;

TextMessage textMsg = new TextMessage("Test Message".getBytes());
@Test
//first conditionn satisfies and second fails
public void AgainstOwnSessionTest() throws Exception {

    List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
    sessions.add(webSocketSession);
    PowerMockito.whenNew(WebSocketSession.class).withNoArguments().thenReturn(webSocketSession);
    for(WebSocketSession wbSessions : sessions) {
        Mockito.when(webSocketSession.isOpen()).thenReturn(true);
        Mockito.when(webSocketSession.getId().equals(wbSessions.getId())).thenReturn(false);
    }
    new SocketHandler().handleTextMessage(webSocketSession,textMsg);

}

@Test
public void TextMessageTest() throws Exception {

    when(webSocketSession.isOpen()).thenReturn(true);

    SocketHandler textHandler = new SocketHandler();


    textHandler. handleTextMessage(webSocketSession, textMsg);

    verify(webSocketSession, times(1)).sendMessage(textMsg);
}

}

當我運行它時,我收到以下錯誤:

org.powermock.reflect.exceptions.ConstructorNotFoundException: No constructor found in class 'org.springframework.web.socket.WebSocketSession' with parameter types: [ <none> ].
at org.powermock.reflect.internal.WhiteboxImpl.throwExceptionIfConstructorWasNotFound(WhiteboxImpl.java:1197)
at org.powermock.reflect.internal.WhiteboxImpl.findUniqueConstructorOrThrowException(WhiteboxImpl.java:1121)
at org.powermock.api.mockito.internal.expectation.DefaultConstructorExpectationSetup.createNewSubstituteMock(DefaultConstructorExpectationSetup.java:94)
at org.powermock.api.mockito.internal.expectation.DefaultConstructorExpectationSetup.withNoArguments(DefaultConstructorExpectationSetup.java:78)
at com.cerner.devacademy.SocketHandlerTest.AgainstOwnSessionTest(SocketHandlerTest.java:30)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:40)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80)
at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:71)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137)
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)

請以某種方式幫助我,現在僅幫助我編寫一個測試用例就足夠了,因為我將嘗試基於此編寫剩余的用例。 在上面提到的所有事情上,我在概念上都非常薄弱,所以請盡量體諒。 提前非常感謝。

我用相同的測試用例編寫了相同的代碼,但在驗證行出現錯誤。

錯誤:

...

Wanted but not invoked:
    webSocketSession.sendMessage(........);
Actually, there were no interactions with this mock.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM