有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java模拟具体类

我正在对连接到服务并返回令牌的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");
}

测试时出错

需要但未调用: 登录视图。startHomeActivity(“测试”); -&燃气轮机;在com。固态硬盘。柏树uimobile。SignInPresentest。当用户的意思和密码正确时,是否应启动ThomesScreen(signInPresentTest.java:72)

在代码中 字符串标记=mSigninService。connectToRestServices(用户名、密码); 它连接到具体类,并且标记为null。是否有一种方法可以模拟此connectToService,以便它返回一些值


共 (1) 个答案

  1. # 1 楼答案

    您的模拟服务协作器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构造函数的生产代码中,可以用对静态工厂方法createSigninPresenterWithService(view)的调用替换构造函数调用new SigninPresenter(view)