2017-07-13 7 views
0

最近私はAndroidプロジェクトでデータバインディングを使用していました。フラグメント単位テストを作成しようとすると、データバインディングがnullと表示されます。ここでAndroidデータバインディングユニットテスト:バインディングがnullです

は、コード例外トレースです:

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 
    } 
} 

私の断片です..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

私は自分自身で答えを探すようです。問題はデータバインディングではなく、テスト自体です。 isInputValid()メソッドをテストするときは、最初にsetUp()メソッドでフラグメントを開始する必要があります。ユニットテストで断片を始める方法(2番目の答え)は、referencesです。

それとも、最初にそれを設定するつもりはない場合、あなたはちょうどこのようtestIsInputValid、編集することができます:あなたは繰り返す必要があるため、2番目のオプションは、実際に悪い習慣です:

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

EDITコードを何度も繰り返します。だから、setUp()の方法でコードを書くことをお勧めします

関連する問題