间谍法在单元测试中,我们已经遇到了一个奇怪的错误从Mockito
,这第一眼看起来微不足道,但经过深入了解,我们无法找到它为什么有效无效使用的参数匹配的像那样。请看下面的代码和抛出的错误。打电话时,里面Matchers.eq
代码
import org.assertj.core.api.Assertions;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
//...
@InjectMocks
@Spy
private MyWebSocket webSocket;
@Mock
private WebSocketUtils webSocketUtils;
@Test
public void myTest() throws IOException {
WebSocketSession session1 = Mockito.mock(WebSocketSession.class);
WebSocketSession session2 = Mockito.mock(WebSocketSession.class);
WebSocketSession session3 = Mockito.mock(WebSocketSession.class);
webSocket.getUserNameWebSocketSessions().put("user1", session1);
webSocket.getUserNameWebSocketSessions().put("user1", session2);
webSocket.getUserNameWebSocketSessions().put("user2", session3);
Mockito.doReturn(new CustomWebSocketMessage<UserSessionInfo>().config(Command.USER_SESSION_INFO).data(new UserSessionInfo()))
.when(webSocket)
.buildUserSessionInfoWebSocketMessage(Mockito.any());
webSocket.onUserPermissionsChange(new UserPermissionsChangedEvent(Collections.singletonList("user1"), this));
ArgumentCaptor<CustomWebSocketMessage> messageCaptor = ArgumentCaptor.forClass(CustomWebSocketMessage.class);
Mockito.verify(webSocketUtils).sendMessageToMultipleUsers(messageCaptor.capture(), Matchers.eq(webSocket.getUserNameWebSocketSessions().get("user1")));
CustomWebSocketMessage message = messageCaptor.getValue();
Assertions.assertThat(message.getMessagePayload().getConfig().getCommand()).isEqualTo(Command.USER_SESSION_INFO.name());
Assertions.assertThat(message.getMessagePayload().getData()).isInstanceOf(UserSessionInfo.class);
}
错误
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
0 matchers expected, 1 recorded:
-> at ... (Name of the bussines package)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
For more info see javadoc for Matchers class.
正如你所看到的,第一个参数是捕手,第二个是从Mockito
包Matcher
。我不知道为什么它不工作,但什么固定它,是从Matchers.eq()
方法让移动会话变量声明。
固定
Collection<WebSocketSession> sessions = webSocket.getUserNameWebSocketSessions().get("user1");
Mockito.verify(webSocketUtils).sendMessageToMultipleUsers(messageCaptor.capture(), Matchers.eq(sessions));
任何人都可以解释我为什么我不得不将它移到一个变量?