如何使用 PowerMockito 模拟对象的方法?

How to mock an object's method using PowerMockito?

我有一个 class,其中包含一个我想测试的方法。这是 class.

class classOne {
private static boolean doneThis = false;
methodOne() {
 CloseableHttpResponse response = SomeClass.postData(paramOne, paramTwo);
                log.info("res - {}", response.getStatusLine().getStatusCode());
                doneThis = true;
}
}

现在,我想使用 PowerMockito 模拟 response.getStatusLine().getStatusCode() 部分。

我怎样才能做到这一点?这就是我所做的,但它(下面的第二行)得到了 NullPointerException。

CloseableHttpResponse response = PowerMockito.mock(CloseableHttpResponse.class);
PowerMockito.when(response.getStatusLine().getStatusCode()).thenReturn(200);

我就是这样嘲笑 Someclass.postData ->

PowerMockito.mockStatic(SomeClass.class);
ParamOne paramOne = new ParamOne(..);
// same for paramTwo    
   PowerMockito.when(SomeClass.postData(paramOne,paramTwo)).thenReturn(response);

更新代码:

CloseableHttpResponse response = PowerMockito.mock(CloseableHttpResponse.class);
StatusLine statusLine = PowerMockito.mock(StatusLine.class);
PowerMockito.when(response.getStatusLine()).thenReturn(statusLine);
PowerMockito.when(statusLine.getStatusCode()).thenReturn(200);

问题是,模拟的 getStatusCode() 在 Test 方法中返回预期值 - 但在实际 class 的情况下,它旁边的行没有被覆盖,即测试是在那一点上失败了。解决方法?

当然要先mock

response.getStatusLine()

否则默认 return 值为 null 并且在 null 上调用 .getStatusCode() 会导致 NullPointerException.

CloseableHttpResponse response = PowerMockito.mock(CloseableHttpResponse.class);
? statusLine = PowerMockito.mock(?.class);
PowerMockito.when(response.getStatusLine()).thenReturn(statusLine);
PowerMockito.when(statusLine.getStatusCode()).thenReturn(200);

?替换为statusLine的实际class。