2017-02-08 8 views
1

2つのスレッドが同じファイルにいくつかの行を書き込むRobolectricでテストを作成しようとしています。ここでの問題は、操作がスレッドセーフであることを保証することではなく、失敗したテストを作成してrobolectricでファイルを同時に変更する方法です。robolectricの同時修正をテストする方法3.2

Robolectricには並行性を処理する方法がありますか?

ShadowApplication.runBackgroundTasks(); 

を使用しようとすると、実際に同時実行の問題が発生するのを防止すること(そのコードに記述されているように)連続的なタスクをやって、私が望んように動作しませんでした。

答えて

0

特に、テストでいくつかのシナリオをシミュレートしたいのですが、マルチスレッドを扱うのは非常に困難です。

私は、タスクの作成と実行中のタスクが分離されたアーキテクチャを構築するために構築しようとしています。例:

public class LoginRunnable extends Runnable { 
    public LoginRunnable(@NonNull SomeNetwork network, @NonNull LoginInfo loginInfo) { 
     this.network = network; 
     this.loginInfo = loginInfo; 
    } 

    public void run() { 
     session = network.login(loginInfo); 
    } 

    public Session getSession(){} 
} 

//somewhere 
ExecutorService networkExecutor = Executors.newFixedThreadPool(5); 

//somwhere else 
SomeNetowrk network = new SomeNetwork(...); 

//somewhere else 
netowrkExecutor.execute(new LoginRunnable(network, new LoginInfo(...))); 

このアプローチを使用すると、すべてのレベルとテスト機能の依存関係を簡単に模擬することができます。実行中のアクションの順序をミックスして、異なる動作をシミュレートすることもできます。これは、実動コードで同時に実行させることです。それはそのような場合の約95%をカバーするはずです。また、5%を休むと、異なるスレッドからの同時変更に対して堅牢なシステムを設計する必要があります。

この方法では、あなたのテストでRobolecricは必要ありません(たぶん)。

java8とRxJavaを使用して定型コードとクラスを作成する必要があります。

希望すると助かります!

関連する問題