Android数据绑定单元测试:绑定为空

时间:2017-07-13 02:42:43

标签: java android unit-testing binding

最近我在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>

有人知道如何使用数据绑定测试片段/活动吗?谢谢你的帮助。

1 个答案:

答案 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()方法

编写代码