我有以下要测试的功能:
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测试) 你会如何建议测试它? 谢谢!
答案 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对象。