@Component
public class MyHealthCheck extends AbstractHealthIndicator {
HttpClient httpClient;
public MyHealthCheck() {
httpClient = HttpClientBuilder.create().build();
}
/**
Added another constructor to the class with an HttpClient argument.
This one can be used for testing
*/
public MyHealthCheck(HttpClient httpClient) {
this.httpClient = httpClient;
}
/**
Method to test
*/
@Override
protected void doHealthCheck(Builder builder) throws Exception {
//
// Execute request and get status code
HttpGet request = new HttpGet("http://www.SomeAuthEndpoint.com");
HttpResponse response = httpClient.execute(request);
//
// Update builder according to status code
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode == 200 || statusCode == 401) {
builder.up().withDetail("Code from service", statusCode);
} else {
builder.unknown().withDetail("Code from service", statusCode);
}
}
}
检测方法:
注意,这里我们使用 Mockito.any(HttpGet.class)
private static HttpClient httpClient;
private static HttpResponse httpResponse;
private static StatusLine statusLine;
@BeforeAll
public static void init() {
//
// Given
httpClient = Mockito.mock(HttpClient.class);
httpResponse = Mockito.mock(HttpResponse.class);
statusLine = Mockito.mock(StatusLine.class);
}
@Test
public void doHealthCheck_endReturns401_shouldReturnUp() throws Exception {
//
// When
when(statusLine.getStatusCode()).thenReturn(401);
when(httpResponse.getStatusLine()).thenReturn(statusLine);
when(httpClient.execute(Mockito.any(HttpGet.class))).thenReturn(httpResponse);
//
// Then
MyHealthCheck myHealthCheck = new MyHealthCheck(httpClient);
Health.Builder builder = new Health.Builder();
myHealthCheck.doHealthCheck(builder);
Status status = builder.build().getStatus();
Assertions.assertTrue(Status.UP == status);
}
5条答案
按热度按时间tvokkenx1#
下面是我使用Mockito和Apache HttpBuilder测试代码的方法:
测试类:
测试:
你认为我需要改进什么吗?(我知道,评论。这是我从我的斯波克背景带来的东西:D)
nkcskrwz2#
在你的单元测试类中,你需要模拟
defaultHttpClient
:然后告诉mockito(例如在
@Before
方法中)通过以下方式实际创建mocks:然后在测试方法中定义
execute()
方法应该返回什么:2ekbmq323#
有一种更好的方法可以做到这一点,而不必添加PowerMock作为另一个依赖项。在这里,您只需要一个额外的构造函数,将HTTPClient作为参数和Mockito。在这个例子中,我创建了一个自定义的健康检查(Spring Actuator),我需要模拟HTTPClient进行单元测试。
组件:
检测方法:
注意,这里我们使用 Mockito.any(HttpGet.class)
dtcbnfnu4#
你可以看看HttpClientMock,我为内部项目写的,但后来决定开源。它允许您使用流畅的API定义模拟行为,并在以后验证所进行的调用的数量。范例:
nzk0hqpo5#
您可以使用PowerMockito轻松地做到这一点,它还可以轻松地模拟final/static方法,私有方法和匿名类。下面是模拟http请求的示例代码。JSON_STRING_DATA是你想从执行方法中获取的任何字符串。