如何在不实际调用 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 这样的库来创建存根而不是自己实现它。