JUnit 4 - 如何模拟视图?

时间:2017-12-11 14:02:17

标签: java android unit-testing junit

我有以下要测试的功能:

public void attemptLogin() {
        // Store values at the time of the login attempt.
        String userid = mUserIdView.getText().toString();

        if (TextUtils.isEmpty(userid)) {
            if (mCurrentUser != null) {
                userid = mCurrentUser.getUserId();
            }
        }
}

我想编写一个单元测试,并将上面的函数作为userId的输入。可以看出,该功能正在做:

mUserIdView.getText().toString();

导致代码失败,因为没有加载UI(我们有UI测试) 你会如何建议测试它? 谢谢!

2 个答案:

答案 0 :(得分:1)

如果你应用dependency injection并且在实例化时将这个视图注入到类中,你可以创建一个Mock然后注入它。

Text dummyText = new Text(myText)
View mockedView= mock(View.class);
when(mockedView.getText()).thenReturn(dummyText);

但是,如果你只想要一些价值,我建议你使用stubs or dummies来简化它。

修改

class MyTextViewStub extends TextView {

    private final CharSequence text;

    public MyTextView(CharSequence text) {
        this.text = text;
    }

    @Override
    public CharSequence getText() {
        return this.text;
    }

}

然后你将这个视图注入课堂上你要测试的内容。

答案 1 :(得分:0)

您需要定义一个模拟mUserIdView,然后对其进行预期,以便getText()返回"无论您希望它返回什么"。

假设您的班级是Presenter处理从视图收到的登录尝试,它将类似于:

public class MyPresenter {
    private final MyView myView;
    private volatile CurrentUser mCurrentUser;
public MyPresenter(MyView myView) {
    this.myView = myView;
}

public void setCurrentUser(CurrentUser currentUser) {
    this.mCurrentUser = currentUser;
}

public void attemptLogin() {
    // Store values at the time of the login attempt.
    String userid = myView.getText().toString();

    if (TextUtils.isEmpty(userid)) {
        if (mCurrentUser != null) {
            userid = mCurrentUser.getUserId();
        }
    }
}
}

然后在测试用例中,您将在初始化期间注入一个模拟的View对象。