模拟抛出空指针异常。新来的mockito

时间:2015-05-26 01:36:57

标签: java unit-testing mockito powermock

我正在尝试测试以下方法

  MainClass {
    ....
        Client client;
        WebTarget target;
        boolean doLogin(MultivaluedMap<String, String> headers) {

             client = getRestClient();
             target = client.target(BASE_URL))
                    .path("v1/login");
              MultivaluedMap<String, Object> castedHeaders = castMap(headers);//casts headers by entry.
              Response loginRsp = target
                    .request().headers(castedHeaders)     
                    .post(Entity.entity(buildIusLoginEntity(),
                                        MediaType.APPLICATION_JSON_TYPE));
              if (loginRsp.getStatus() != HttpServletResponse.SC_OK) {

                    return false;
              }
              return true;
        }
   }

使用以下测试类

  @Test
  public void testdoLoginNegative() {
            MainClass m = spy(new MainClass());
            Client mockClient = mock(Client.class);
            WebTarget target = mock(WebTarget.class);

            Response loginRsp = Response.status(500).build();
            doReturn(mockClient).when(m).getRestClient();
            when(mockClient.target(anyString()).path(anyString())).thenReturn(target);
            //NPE on next line.
            when(target.request().headers(any(MultivaluedMap.class)).post(any(Entity.class))).thenReturn(loginRsp);// this line throws a Null pointer exception. 
            Assert.assertFalse(m.doIusLogin(getMockHeaders()));
   }

但是,我的模拟似乎显示了源代码中指示的空指针异常。任何关于我可能做错的想法......都将不胜感激。

1 个答案:

答案 0 :(得分:7)

您尝试使用深层存根而不准备模拟对象。尝试

 WebTarget target = mock(WebTarget.class, Mockito.RETURNS_DEEP_STUBS);

不同之处在于,没有深度存根的模拟返回方法调用的默认值(通常为null)。如果您使用Mockito.when附加此类通话,则此功能无效,但如果您追加其他通话,则会导致NullPointerException s,例如在

target
  .request()                          // return null
  .headers(any(MultivaluedMap.class)) // NullPointerException
  .post(any(Entity.class)))

但我希望

mockClient
  .target(anyString())                // should return null
  .path(anyString()))                 // should throw NullPointerException
使用NullPointerException

也会失败,而不使用

激活深层存根
Client mockClient = mock(Client.class, Mockito.RETURNS_DEEP_STUBS);

激活深度存根可能不方便编写测试,但它可能导致测试代码中的奇怪行为。