Java 如何对异步交互器进行单元测试?

Java 如何对异步交互器进行单元测试?,java,unit-testing,junit,Java,Unit Testing,Junit,我是junit测试的新手,我需要用一些异步调用来测试一个交互器。我的问题是,在不破坏测试统一性的情况下,我不明白我需要测试什么 如果我测试对interactor.execute()的纯调用,那么我也在测试其他interactor功能。我可以模拟交互依赖项,但它们是被忽略的。我知道这是一个概念上的误解,肯定比我想象的要容易得多 public class NewLoginInteractorImpl implements NewLoginInteractor { private final

我是junit测试的新手,我需要用一些异步调用来测试一个交互器。我的问题是,在不破坏测试统一性的情况下,我不明白我需要测试什么

如果我测试对interactor.execute()的纯调用,那么我也在测试其他interactor功能。我可以模拟交互依赖项,但它们是被忽略的。我知道这是一个概念上的误解,肯定比我想象的要容易得多

public class NewLoginInteractorImpl implements NewLoginInteractor {

    private final GetRegistrationIdInteractor getRegistrationIdInteractor;
    private final GetDeviceIdInteractor getDeviceIdInteractor;
    private final GetAndroidOSVersionInteractor getAndroidOSVersionInteractor;
    private final NewLoginWebService newLoginWebService;
    private static final String TAG = "NewLoginInteractorImpl";


    @Inject
    public NewLoginInteractorImpl(GetRegistrationIdInteractor getRegistrationIdInteractor, GetDeviceIdInteractor getDeviceIdInteractor, GetAndroidOSVersionInteractor getAndroidOSVersionInteractor, NewLoginWebService newLoginWebService) {
        this.getRegistrationIdInteractor = getRegistrationIdInteractor;
        this.getDeviceIdInteractor = getDeviceIdInteractor;
        this.getAndroidOSVersionInteractor = getAndroidOSVersionInteractor;
        this.newLoginWebService = newLoginWebService;
    }

    @Override
    public void execute(final Callback callback) {
        final String deviceId = getDeviceIdInteractor.execute();
        final String os_version = getAndroidOSVersionInteractor.execute();
        getRegistrationIdInteractor.execute(new GetRegistrationIdInteractor.Callback() {
            @Override
            public void onSuccess(String regid) {
                NoLoginUser noLoginUser = new NoLoginUser(deviceId, regid, os_version);
                callNoLoginWebService(noLoginUser, callback);
            }

            @Override
            public void onFailure(String error) {
                callback.onFailureGettingRegistrationId(error);
            }

            @Override
            public void onRecoverableError(int resultCode, int playServicesResolutionRequest) {
                callback.onRecoverableError(resultCode, playServicesResolutionRequest);
            }
        });
    }

    private void callNoLoginWebService(NoLoginUser noLoginUser, final Callback callback) {

        newLoginWebService.noLogin(noLoginUser, new NewLoginWebService.Callback() {

            @Override
            public void onNoLoginFailure(String errorText) {
                callback.onNoLoginFailure(errorText);
            }

            @Override
            public void onNoLoginInvalidValues(JSONObject error) {
                callback.onFailureGettingRegistrationId("ERROR");
            }

            @Override
            public void onNoLoginSuccess(JSONObject response) {
                callback.onSuccess(response);
            }

            @Override
            public void onNullResponse() {
                callback.onNullResponse();
            }
        });
    }
}

一个好的模拟框架,如or(不是一个独立的框架,但增强了Mockito或EasyMock),可以毫无问题地处理注入问题。是的,你可能真的想嘲笑其他的交互者-理想情况下他们有自己的测试,所以在这里嘲笑他们你会说“这些应该像这样工作”。如果它们不起作用,就编写测试来解决问题。一个好的模拟框架,如or(不是独立的,但增强了Mockito或EasyMock),可以毫无问题地处理注入问题。是的,你可能真的想嘲笑其他的交互者-理想情况下他们有自己的测试,所以在这里嘲笑他们你会说“这些应该像这样工作”。如果它们不起作用,就编写测试来解决问题。一个好的模拟框架,如or(不是独立的,但增强了Mockito或EasyMock),可以毫无问题地处理注入问题。是的,你可能真的想嘲笑其他的交互者-理想情况下他们有自己的测试,所以在这里嘲笑他们你会说“这些应该像这样工作”。如果它们不起作用,就编写测试来解决问题。