如何在不实际调用 REST API 的情况下测试我的应用程序方法是否处理 REST API 的 HTTP 状态 404
How to test if my application method handles HTTP status 404 of a REST API without actually calling that REST API
我目前正在尝试使用 JUnit 为我的应用程序自动执行一些测试。我的应用程序有一个调用第三方 REST API 的方法。我需要检查该方法是否正在处理 404 之类的 HTTP 状态代码,而无需实际调用第 4 方 API。
例如,我的方法:
public int getNumUsers(){
//call the 3rd party API - https://example.com/api/users/count
//return user count
}
我需要测试 getNumUsers 方法是否正在处理可能由第 3 方返回的 HTTP 状态代码 404 API - https://example.com/api/users/count.
有什么建议吗?
将对“第 3 方 API”的 http 调用提取到它自己的对象中。将该对象传递到要测试的 class 的构造函数中。
现在您可以在单元测试中用测试替身 (stub/mock) 替换它并控制它 returns。正确的结果值或错误。
像这样:
这是第三部分API
interface UserApi {
int getUserCount ();
}
您的用户服务将调用此 api
class UserService {
private final UserApi api;
UserService(UserApi api) {
this.api = api;
}
int getUserCount() {
// todo handle errors
return api.getUserCount ();
}
}
和一些测试
public class UserServiceTest {
@Test
public void shouldProvideUserCount() {
UserService service = new UserService (new UserApi () {
@Override
public int getUserCount () {
return 1;
}
});
// when
int count = service.getUserCount ();
// then
assertEquals(1, count);
}
@Test(expected = UserOperationFailedException.class)
public void shouldHandleApiError() {
UserService service = new UserService (new UserApi () {
@Override
public int getUserCount () {
throw new ApiException();
}
});
// when
service.getUserCount ();
}
}
您可以使用像 Mockito 这样的库来创建存根而不是自己实现它。
我目前正在尝试使用 JUnit 为我的应用程序自动执行一些测试。我的应用程序有一个调用第三方 REST API 的方法。我需要检查该方法是否正在处理 404 之类的 HTTP 状态代码,而无需实际调用第 4 方 API。
例如,我的方法:
public int getNumUsers(){
//call the 3rd party API - https://example.com/api/users/count
//return user count
}
我需要测试 getNumUsers 方法是否正在处理可能由第 3 方返回的 HTTP 状态代码 404 API - https://example.com/api/users/count.
有什么建议吗?
将对“第 3 方 API”的 http 调用提取到它自己的对象中。将该对象传递到要测试的 class 的构造函数中。
现在您可以在单元测试中用测试替身 (stub/mock) 替换它并控制它 returns。正确的结果值或错误。
像这样:
这是第三部分API
interface UserApi {
int getUserCount ();
}
您的用户服务将调用此 api
class UserService {
private final UserApi api;
UserService(UserApi api) {
this.api = api;
}
int getUserCount() {
// todo handle errors
return api.getUserCount ();
}
}
和一些测试
public class UserServiceTest {
@Test
public void shouldProvideUserCount() {
UserService service = new UserService (new UserApi () {
@Override
public int getUserCount () {
return 1;
}
});
// when
int count = service.getUserCount ();
// then
assertEquals(1, count);
}
@Test(expected = UserOperationFailedException.class)
public void shouldHandleApiError() {
UserService service = new UserService (new UserApi () {
@Override
public int getUserCount () {
throw new ApiException();
}
});
// when
service.getUserCount ();
}
}
您可以使用像 Mockito 这样的库来创建存根而不是自己实现它。