繁体   English   中英

模拟课程

[英]Mocking concrete class

我正在对连接到服务并返回令牌的Presenter类进行单元测试,当用户从调用REst服务的异步任务中收到令牌时,“主页”屏幕将启动。 如果令牌为空,则显示错误

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(“ test”); -> com.ssd.cypress.uimobile.SigninPresenterTest.shouldStartHomeScreenWhenUsernameAndPasswordAreCorrect(SigninPresenterTest.java:72)

在代码中,String token = mSigninService.connectToRestServices(用户名,密码); 它连接到具体类,并且令牌为空。 有没有一种方法可以模拟此connectToService,以便它返回SomeValue。

在测试期间,永远不会调用模拟服务合作者mService ,因为它不会传递或注入到被测类中。 根据您的评论,我认为您已经意识到这一点。

要按照我的理解来重述您的评论,您想使用协作者的模拟程序( Sign_in_service一个实例),但是您不能这样做,因为协作者是由创建而不是传递给测试中的类SigninPresenter

问题是您的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构造函数的生产代码中,可以用对静态工厂方法createSigninPresenterWithService(view)的调用来替换构造函数调用new SigninPresenter(view) createSigninPresenterWithService(view)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM