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,然后可以覆盖它。如果你想做更多的事情而不是存根,请小心,因为你正在使这个对象行为不一致。如果你认为它回答了你的问题,记得把它标记为一个已解决的问题。