嘲弄具体课程

时间:2016-03-12 19:37:00

标签: java android unit-testing mockito

我正在测试一个Presenter类,它连接到服务并返回一个令牌 当用户从调用REst服务的Async任务接收到令牌时,将启动主屏幕。如果token为null,则显示错误

public void onSignInButtonClicked() {

    String username = mSigninView.getUsername();


    if (username.isEmpty()) {
        mSigninView.showUsernameError(R.string.username_error);
        return;
    }

    String password = mSigninView.getPassword();
    if (password.isEmpty()) {
        mSigninView.showPasswordError(R.string.password_error);
        return;
    }

    String token = mSigninService.connectToRestServices(username, password);
    if (token != null) {
        mSigninView.startHomeActivity(token);
    } else {
        mSigninView.showLoginError(R.string.login_error);
    }
}

对于单元测试:

@Test
public void shouldStartHomeScreenWhenUsernameAndPasswordAreCorrect() throws Exception {
    Mockito.when(mView.getUsername()).thenReturn("test@test.com");
    Mockito.when(mView.getPassword()).thenReturn("test");
    Mockito.when(mService.connectToRestServices("test@test.com", "test")).thenReturn("test");
    mPresenter.onSignInButtonClicked();
    Mockito.verify(mView).startHomeActivity("test");
}

测试时出错

想要但未被援引: signin_View.startHomeActivity( “测试”); - >在com.ssd.cypress.uimobile.SigninPresenterTest.shouldStartHomeScreenWhenUsernameAndPasswordAreCorrect(SigninPresenterTest.java:72)

在代码中 String token = mSigninService.connectToRestServices(username,password); 它连接到具体类,令牌为null。有没有办法模拟这个connectToService,以便它返回SomeValue。

1 个答案:

答案 0 :(得分:0)

您的模拟服务协作者mService在测试期间从未被调用过,因为它没有被传入或注入到被测试的类中。根据您的意见,我认为您意识到了这一点。

要根据我的理解重述您的评论,您希望使用协作者的模拟 - Sign_in_service的实例 - 但您不能这样做,因为协作者是由创建而不是传递到您的班级在测试中 - SigninPresenter

问题是SigninPresenter的构造函数,它不应该负责创建协作者。您似乎拥有相关代码,因此您可以更改设计。

我建议您使用以下内容替换SigninPresenter构造函数:

    public static SigninPresenter createSigninPresenterWithService(Signin_View view) {
        return new SigninPresenter(view,  new Sign_in_service());
    }

    protected SigninPresenter(Signin_View view, Sign_in_service service) { 
        mSigninView = view; 
        mSigninService = service; 
    }  

对于您的测试,您可以调用构造函数并传入服务的模拟以初始化mPresenter,即:mPresenter = new SignInPresenter(mView, mService)。在当前调用SigninPresenter构造函数的生产代码中,可以通过调用静态工厂方法new SigninPresenter(view)替换构造函数调用createSigninPresenterWithService(view)