2017-11-01 28 views
0

Room永続ライブラリでいくつかのテストを行っていますが、予期しない結果が@BeforeClassから発生しています。ドキュメントでは、すべてのテストの前に一度だけ関数を呼び出すことになり、プロセスの初期化に使用されます。テスト関数createcurrenciesは機能しますが、ダミーのcreatecurrencypairsは機能しません。私がclearcurrenciesを(セットアップから)削除した場合にのみ、それは期待通りに機能します。私のテストからは、すべてのテストの前にBeforeClassが実行されているようです。何か案は?@BeforeClassが期待どおりに動作しない

@RunWith(AndroidJUnit4.class) 
public class ExampleInstrumentedTest { 

    private static myDb dbh = null; 
    private static Context context = null; 
    private static Integer n = 100; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     context = InstrumentationRegistry.getTargetContext(); 
     dbh = myDb.getDatabase(context); 
     dbh.daoCurrency().clearCurrencies(); 
    } 

    @Test 
    public void createCurrencies() { 


     Integer n=100; 

     for (Integer i=1; i<=n; i++) 
     { 
      Currency c = new Currency(); 
      c.setCode("CUR"+i); 

      dbh.daoCurrency().addCurrencies(c); 
     } 

     List<Currency> currencyList = dbh.daoCurrency().getCurrencies(); 
     assertEquals((Integer) n, (Integer) currencyList.size()); 
    } 

    @Test 
    public void createCurrencyPairs() { 

     List<Currency> currencyList = dbh.daoCurrency().getCurrencies(); 

     assertEquals((Integer) n, (Integer) currencyList.size()); 

    } 

    @AfterClass 
    public static void tearDown() throws Exception { 
     dbh.close(); 
    } 
} 
+1

あなたの2つのテストはお互いに依存しているように見えます.1つはデータをデータベースに挿入し、もう1つは以前のテストのものを見つけようとします。それは悪い習慣です。ユニットテストは、別のユニットテストで何が起きたかに依存してはいけません。テストメソッドが特定の順序で実行されるという保証はありません。 – Jesper

+0

私の最初のセットアップ。はい、論理的に聞こえます。私はそれを再加工します。ありがとう – jcuypers

+0

解答を投稿して[ツアー]を受け入れるか、これを行うためのエネルギーがない場合は質問を削除するだけで、タイトルに解答を追加しないでください。 –

答えて

0

私が受け取ったフィードバックに基づいて、私はそれを修正し、現在は期待どおりに動作します。

@RunWith(AndroidJUnit4.class) 
public class ExampleInstrumentedTest { 

    private static myDb dbh = null; 
    private static Context context = null; 
    private static Integer n = 100; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     context = InstrumentationRegistry.getTargetContext(); 
     dbh = myDb.getDatabase(context); 
    } 

    @Before 
    public void clear() throws Exception { 
     dbh.daoCurrency().clearCurrencies(); 
     dbh.daoCurrencyPair().clearCurrencyPairs(); 
    } 



    public void createCurrencies() { 
     Integer n=100; 

     for (Integer i=1; i<=n; i++) 
     { 
      Currency c = new Currency(); 
      c.setCode("CUR"+i); 

      dbh.daoCurrency().addCurrencies(c); 
     } 

    } 

    public void createCurrencyPairs() { 

     List<Currency> currencyList = dbh.daoCurrency().getCurrencies(); 

     for (Currency c1 : currencyList) 
     { 
      for (Currency c2 : currencyList) 
      { 
       CurrencyPair cp = new CurrencyPair(); 
       cp.setBaseId(c1.getId()); 
       cp.setCounterId(c2.getId()); 

       dbh.daoCurrencyPair().addCurrencyPairs(cp); 
      } 

     } 

    } 

    @Test 
    public void testCurrencies() { 

     createCurrencies(); 

     List<Currency> currencyList = dbh.daoCurrency().getCurrencies(); 
     assertEquals((Integer) n, (Integer) currencyList.size()); 
    } 

    @Test 
    public void testCurrencyPairs() { 

     createCurrencies(); 
     createCurrencyPairs(); 

     List<CurrencyPair> currencypairList = dbh.daoCurrencyPair().getCurrencyPairs(); 
     assertEquals((Integer) (n*n), (Integer) currencypairList.size()); 
    } 

    @AfterClass 
    public static void tearDown() throws Exception { 
     dbh.close(); 
    } 
} 
関連する問題