jersey/Mockito:client.post 调用验证时出现 NullInsteadOfMockException
jersey/Mockito: NullInsteadOfMockException on client.post call verification
我 运行 在单元测试以下球衣客户端调用时遇到了一个奇怪的问题:
WebResource webResource = _client.resource(url);
ClientResponse response = webResource
.accept("application/json")
.type("application/x-www-form-urlencoded")
.post(ClientResponse.class, postBody);
PostBody 是一个多值映射。
单元测试可以很好地验证 accept
和 type
调用,但在 post
调用时失败,出现以下异常:
org.mockito.exceptions.misusing.NullInsteadOfMockException:
Argument passed to verify() should be a mock but is null!
测试代码如下:
_client = Mockito.mock(Client.class);
_webResource = Mockito.mock(WebResource.class);
_builder = Mockito.mock(WebResource.Builder.class);
_response = Mockito.mock(ClientResponse.class);
Mockito.when(_client.resource(Mockito.anyString())).thenReturn(_webResource);
Mockito.when(_response.getEntity(Mockito.any(Class.class))).thenReturn(new RefreshTokenDto());
Mockito.when(_response.getStatus()).thenReturn(200);
Mockito.when(_builder.post(Mockito.eq(ClientResponse.class), Mockito.anyObject())).thenReturn(_response);
Mockito.when(_builder.type(Mockito.anyString())).thenReturn(_builder);
Mockito.when(_webResource.accept(Mockito.anyString())).thenReturn(_builder);
RefreshTokenDto response = _clientWrapper.exchangeAuthorizationCodeForToken(_token);
Assert.assertNotNull(response);
Mockito.verify(_client.resource(_baseUrl + "token"));
Mockito.verify(_webResource.accept("application/json"));
Mockito.verify(_builder.type("application/x-www-form-urlencoded"));
// TODO: this line throws NullRefExc for some unknown reason
Mockito.verify(_builder.post(Mockito.any(Class.class), Mockito.any(MultivaluedMap.class)));
你能看出这段代码有什么问题吗?
是的。您误用了 verify
。 verify
的参数必须是模拟本身。然后调用要验证 verify
返回值的方法。所以在这种情况下,第一个 verify
调用应该是
Mockito.verify(_client).resource(_baseUrl + "token");
其他 verify
调用也类似。
我运行进入这个问题,但是对于when()
而不是verify()
。我通过谷歌搜索发现了这个问题。对我来说,我忘了在我的测试 class' 构造函数中添加 MockitoAnnotations.initMocks()
。
出现此错误是因为我进行了错误的验证调用。我用了
verify(mock.methodToVerify, times(n));
而不是
verify(mock, times(n)).methodToVerify();
我 运行 在单元测试以下球衣客户端调用时遇到了一个奇怪的问题:
WebResource webResource = _client.resource(url);
ClientResponse response = webResource
.accept("application/json")
.type("application/x-www-form-urlencoded")
.post(ClientResponse.class, postBody);
PostBody 是一个多值映射。
单元测试可以很好地验证 accept
和 type
调用,但在 post
调用时失败,出现以下异常:
org.mockito.exceptions.misusing.NullInsteadOfMockException:
Argument passed to verify() should be a mock but is null!
测试代码如下:
_client = Mockito.mock(Client.class);
_webResource = Mockito.mock(WebResource.class);
_builder = Mockito.mock(WebResource.Builder.class);
_response = Mockito.mock(ClientResponse.class);
Mockito.when(_client.resource(Mockito.anyString())).thenReturn(_webResource);
Mockito.when(_response.getEntity(Mockito.any(Class.class))).thenReturn(new RefreshTokenDto());
Mockito.when(_response.getStatus()).thenReturn(200);
Mockito.when(_builder.post(Mockito.eq(ClientResponse.class), Mockito.anyObject())).thenReturn(_response);
Mockito.when(_builder.type(Mockito.anyString())).thenReturn(_builder);
Mockito.when(_webResource.accept(Mockito.anyString())).thenReturn(_builder);
RefreshTokenDto response = _clientWrapper.exchangeAuthorizationCodeForToken(_token);
Assert.assertNotNull(response);
Mockito.verify(_client.resource(_baseUrl + "token"));
Mockito.verify(_webResource.accept("application/json"));
Mockito.verify(_builder.type("application/x-www-form-urlencoded"));
// TODO: this line throws NullRefExc for some unknown reason
Mockito.verify(_builder.post(Mockito.any(Class.class), Mockito.any(MultivaluedMap.class)));
你能看出这段代码有什么问题吗?
是的。您误用了 verify
。 verify
的参数必须是模拟本身。然后调用要验证 verify
返回值的方法。所以在这种情况下,第一个 verify
调用应该是
Mockito.verify(_client).resource(_baseUrl + "token");
其他 verify
调用也类似。
我运行进入这个问题,但是对于when()
而不是verify()
。我通过谷歌搜索发现了这个问题。对我来说,我忘了在我的测试 class' 构造函数中添加 MockitoAnnotations.initMocks()
。
出现此错误是因为我进行了错误的验证调用。我用了
verify(mock.methodToVerify, times(n));
而不是
verify(mock, times(n)).methodToVerify();