首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟混凝土类

模拟混凝土类
EN

Stack Overflow用户
提问于 2016-03-13 03:37:00
回答 1查看 806关注 0票数 0

我正在单元测试一个Presenter类,它连接到服务并在用户从调用REst服务的异步任务收到令牌时返回令牌,主屏幕启动。如果内标识为空,则显示错误

代码语言:javascript
复制
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);
    }
}

对于单元测试:

代码语言:javascript
复制
@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)处的->

在代码字符串token = mSigninService.connectToRestServices(username,password中);它连接到具体类,token为空。有没有办法模拟这个connectToService,让它返回SomeValue。

EN

回答 1

Stack Overflow用户

发布于 2016-03-13 16:34:57

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

根据我的理解,重申您的注释,您希望使用协作者的模拟- Sign_in_service的实例-但您不能这样做,因为协作者是在test - SigninPresenter下由您的类创建的,而不是传递到您的类中。

问题出在SigninPresenter的构造函数上,它不应该负责创建协作者。看起来你拥有有问题的代码,所以你可以改变设计。

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

代码语言:javascript
复制
    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)的调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35962393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档