jersey/Mockito:对client.post调用验证的NullInsteadOfMockException

Joa*_*rks 6 java jersey mockito

我遇到了一个奇怪的问题,单元测试以下的泽西客户端调用:

WebResource webResource = _client.resource(url);
ClientResponse response = webResource
                        .accept("application/json")
                        .type("application/x-www-form-urlencoded")
                        .post(ClientResponse.class, postBody);
Run Code Online (Sandbox Code Playgroud)

PostBody是一个多值地图.

单元测试验证罚款accepttype调用,但在post具有此异常的情况下失败:

org.mockito.exceptions.misusing.NullInsteadOfMockException: 
Argument passed to verify() should be a mock but is null!
Run Code Online (Sandbox Code Playgroud)

这是测试代码:

_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)));
Run Code Online (Sandbox Code Playgroud)

你能看到这段代码有什么问题吗?

Daw*_*ica 14

是.你误用了verify.verify必须是模拟本身的论点.然后,您调用要在其返回的值上验证的方法verify.所以在这种情况下,第一次verify调用应该是

Mockito.verify(_client).resource(_baseUrl + "token");
Run Code Online (Sandbox Code Playgroud)

和其他verify电话类似.

  • 嘿——这确实解决了问题!我混淆了“when”和“verify”的语法。我从昨天开始就一直在查看这段代码,但不知道哪里出了问题。这可能表明我是mockito的新手。感谢您的帮助! (2认同)