最近我在Android项目上使用数据绑定。当我尝试创建片段单元测试时,它表示数据绑定为空。
以下是代码异常跟踪:
java.lang.NullPointerException: Attempt to read from field 'android.support.design.widget.TextInputLayout com.example.android.databinding.AFragmentBinding.textInputMortgagePrice' on a null object reference
这是我的单元测试代码段:
public void testIsInputValid() {
assertTrue(mFragment.isInputValid());
}
这是我的AFragment.java代码片段:
public class AFragment {
private AFragmentBinding binding;
@Override
public boolean isInputValid() {
resetError();
return !isEmptyEditTextExist(); //A method to check if the text is empty
}
private void resetError() {
binding.aTextInput.setError(null); //Here's where the error found
}
}
这是我的fragment.xml:
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="AFragment">
<data>
<variable
name="vmA"
type="path.to.viewmodel.class"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.design.widget.TextInputLayout
android:id="@+id/a_text_input"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/a_edit_text"
android:imeOptions="actionNext"
android:inputType="number"
android:maxLength="17"
android:text="@={vmA.price}"/>
</android.support.design.widget.TextInputLayout>
</LinearLayout>
有人知道如何使用数据绑定测试片段/活动吗?谢谢你的帮助。
答案 0 :(得分:0)
看起来我自己找到了答案。问题不是数据绑定,而是测试本身。当我测试isInputValid()
方法时,我需要先在setUp()
方法中启动片段。这里有一些references如何在单元测试中启动片段(第二个答案)。
或者,如果您不打算先设置它,您可以编辑testIsInputValid,如下所示:
public void testIsInputValid() {
FragmentManager fragmentManager = mActivity.getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(mFragment, null);
ft.commit();
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
getActivity().getSupportFragmentManager().executePendingTransactions();
}
});
getInstrumentation().waitForIdleSync();
assertTrue(mFragment.isInputValid());
}
编辑:第二种选择实际上是一种不好的做法,因为你需要反复重复代码。所以,我建议你用setUp()
方法