Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit4-如何模拟视图?_Java_Android_Unit Testing_Junit - Fatal编程技术网

Java JUnit4-如何模拟视图?

Java JUnit4-如何模拟视图?,java,android,unit-testing,junit,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) {

我想测试以下功能:

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测试) 您建议如何测试它? 谢谢

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

Text dummyText = new Text(myText)
View mockedView= mock(View.class);
when(mockedView.getText()).thenReturn(dummyText);
但如果你只是想得到一些价值,我建议你用它来简化

编辑:

class MyTextViewStub extends TextView {

    private final CharSequence text;

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

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

}
然后将该视图注入到您想要测试的类中。

如果您应用该视图,并且该视图在实例化时被注入到类中,那么您可以创建一个模拟,然后注入它

Text dummyText = new Text(myText)
View mockedView= mock(View.class);
when(mockedView.getText()).thenReturn(dummyText);
但如果你只是想得到一些价值,我建议你用它来简化

编辑:

class MyTextViewStub extends TextView {

    private final CharSequence text;

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

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

}

然后将此视图注入到要测试的类中。

您需要定义一个mock mUserIdView,然后对其进行期望,以便getText()返回“您希望它返回的任何内容”

假设您的类是处理从视图接收到的登录尝试的演示者,它将如下所示:

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();
        }
    }
}
}

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

您需要定义一个模拟mUserIdView,然后对其进行期望,以便getText()返回“您希望它返回的任何内容”

假设您的类是处理从视图接收到的登录尝试的演示者,它将如下所示:

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();
        }
    }
}
}

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

通过模拟
mUserIdView
并在
getText()上写入method@Ivonet你能解释一下吗?事实上,我简短地说了下面的@Pau Trepat得出的结果。如果使用依赖项注入,您可以模拟出东西(mockito的期望值是'when':-))通过模拟
mUserIdView
和在
getText()上编写期望值,这是非常幸运的method@Ivonet你能解释一下吗?事实上,我简短地说了下面的@Pau Trepat得出的结果。如果使用依赖注入,您可以模拟出一些东西(mockito的期望值是'when':-))很好地感谢响应!我认为存根是我最好的解决方案。我想不出如何存根这个函数。你能给我举个例子吗?应该行。getText函数不是final,然后可以覆盖它。如果你想做更多的事情而不是存根,请小心,因为你正在使这个对象行为不一致。如果你认为它回答了你的问题,记得把它标记为一个已解决的问题。谢谢你的回应!我认为存根是我最好的解决方案。我想不出如何存根这个函数。你能给我举个例子吗?应该行。getText函数不是final,然后可以覆盖它。如果你想做更多的事情而不是存根,请小心,因为你正在使这个对象行为不一致。如果你认为它回答了你的问题,记得把它标记为一个已解决的问题。