間諜法在單元測試中,我們已經遇到了一個奇怪的錯誤從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));
任何人都可以解釋我爲什麼我不得不將它移到一個變量?