【问题标题】:write a test for WebSocketHandlerDecorator - Delegate must not be null为 WebSocketHandlerDecorator 编写测试 - 委托不能为空
【发布时间】:2019-01-17 12:16:22
【问题描述】:

我想写一个测试来测试我的 WebSocketHandlerDecorator,但是遇到了一些问题。

这是错误:

java.lang.IllegalArgumentException: 委托不能为空

在 org.springframework.util.Assert.notNull(Assert.java:193) 在 org.springframework.web.socket.handler.WebSocketHandlerDecorator.(WebSocketHandlerDecorator.java:42)

import org.springframework.util.Assert;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;  

public class MyWebSocketHandlerDecorator extends WebSocketHandlerDecorator {

    public MySocketHandlerDecorator(WebSocketHandler delegate) {
        super(delegate);
    }

    @Override
    public void handleMessage(final WebSocketSession session, final WebSocketMessage<?> message) throws Exception {

        final TextMessage MyMessage = (TextMessage) message;
        super.handleMessage(session, MyMessage);
    }
}

这是我的测试用例:

public class MyWebSocketHandlerDecpratorTest {

    @Mock
    private WebSocketSession session;

    @Mock
    WebSocketHandler delegate;

    @Spy
    private WebSocketHandlerDecorator webSocketHandlerDecorator = new WebSocketHandlerDecorator(delegate);

    @InjectMocks
    MyWebSocketHandlerDecorator myWebSocketHandlerDecorator;

    private TextMessage message;

    @Before
    public void set_up(){
        MockitoAnnotations.initMocks(this);
        message = new TextMessage("Test Message".getBytes());
    }

    @Test
    public void handleMessage()throws Exception{
        myWebSocketHandlerDecorator.handleMessage(session, message);
        verify(webSocketHandlerDecorator, times(1)).handleMessage(session, message);
    }
}

谁能帮我纠正我的测试并找出它有什么问题?

public WebSocketHandlerDecorator(WebSocketHandler delegate) {
    Assert.notNull(delegate, "Delegate must not be null");
    this.delegate = delegate;
}

【问题讨论】:

  • 看来您必须为委托提供一个实例
  • 你是对的,但是这里的WebSocketHandler是一个接口,如果我用@mock来模拟它作为一个实例,它肯定是一个空值

标签: java unit-testing spring-boot testing websocket


【解决方案1】:

您必须在@Before 方法中设置您的@Spy,因为在创建类时,模拟尚未初始化:

public class MyWebSocketHandlerDecpratorTest {
    @Mock
    private WebSocketSession session;

    @Mock
    WebSocketHandler delegate;

    private WebSocketHandlerDecorator webSocketHandlerDecorator;

    @InjectMocks
    MyWebSocketHandlerDecorator myWebSocketHandlerDecorator;

    private TextMessage message;

    @Before
    public void set_up(){
        MockitoAnnotations.initMocks(this);
        webSocketHandlerDecorator = Mockito.spy(new WebSocketHandlerDecorator(delegate));
        message = new TextMessage("Test Message".getBytes());
    }

    @Test
    public void handleMessage()throws Exception{
        myWebSocketHandlerDecorator.handleMessage(session, message);
        verify(webSocketHandlerDecorator, times(1)).handleMessage(session, message);
    }
}

【讨论】:

  • 感谢@Lino,它可以工作,但发生错误:实际上,与此模拟的交互为零。需要但未调用:webSocketHandlerDecorator.handleMessage( session, TextMessage payload=[Test Messa..], byteCount=13, last=true] );
  • @HungryBird 是delegate 还是webSocketHandlerDecorator 注入myWebSocketHandlerDecorator?如果是后者,那么您必须手动注入模拟(也在 @Before 方法中)
  • 嗨@Lino,当我用“@RunWith(MockitoJUnitRunner.class)”标记测试文件时,错误(实际上,与此模拟的交互为零。想要但未调用)再次发生。 ..如果我不提供“@RunWith”,它运行良好,Runwith default runner 和 mockito runner 有什么区别?这种情况会导致什么结果?
  • @HungryBird 您是否从您的@Before 方法中删除了MockitoAnnotations.initMocks(this)?两者都做同样的事情,但你应该只使用一个。我更喜欢@RunWith,因为它不会弄乱我的设置代码
  • 感谢您的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
相关资源
最近更新 更多