特に、テストでいくつかのシナリオをシミュレートしたいのですが、マルチスレッドを扱うのは非常に困難です。
私は、タスクの作成と実行中のタスクが分離されたアーキテクチャを構築するために構築しようとしています。例:
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を使用して定型コードとクラスを作成する必要があります。
希望すると助かります!