JUnitでのテストメソッドの実行順序は保証できません。
スイート内のテストクラスの実行順序は保証されますが ( Suiteを使用している場合)、テスト クラスがリフレクションによって検出された場合の実行順序は保証されません (たとえば、Eclipse でパッケージを実行している場合)。 、またはmavenまたはantからの一連のテスト)。これは ant または maven で定義できる場合がありますが、JUnit では定義されていません。
一般に、JUnit はソース ファイルで定義されている順序でテスト メソッドを実行しますが、すべての JVM がこれを保証するわけではありません (特に JVM 7 の場合)。一部のメソッドが抽象基本テスト クラスから継承されている場合、これも当てはまらない場合があります。(これはあなたのケースのように聞こえますが、あなたの説明からはわかりません)。
詳細については、Has JUnit4 がテストの注文のサポートを開始しましたか?に対する私の回答を参照してください。意図的なものですか?.
では、問題を解決するために何ができますか? 解決策は 2 つあります。
元の例では、実際には 1 つのテスト (verify) しかありませんが、2 つのセットアップ (createUser、joinUserToRoom) と 1 つのティアダウン (deleteUser) の 4 つのメソッドがあります。したがって、最初のオプションは、TestRule、特にExternalResourceを使用して、テスト ケースをより適切に定義することです。ExternalResource
と同様に、テストの前後の動作を定義できます@Before/@After
。ただし、の利点は、ExternalResource
これをテストから除外できることです。
したがって、外部リソースでユーザーを作成/削除します。
public class UsesExternalResource {
@Rule
public ExternalResource resource= new ExternalResource() {
@Override
protected void before() throws Throwable {
// create user
};
@Override
protected void after() {
// destroy user
};
};
@Test
public void testJoinUserToRoom() {
// join user to room
// verify all ok
}
}
私にとって、これはよりシンプルで理解しやすく、独立したテストを取得できることは良いことです. これは私がすることですが、テストを少しリファクタリングする必要があります。RuleChainを使用して、これらのルールを積み重ねることもできます。
テスト メソッド間に依存関係を本当に導入したい場合の 2 番目のオプションは、あるテストから別のテストへの依存関係を定義できるTestNGを調べることです。