2017-11-09 20 views
1

私はしばしば異なるタイプのテストを書く。テストの種類によって、セットアップが異なる場合があります。IntelliJ Idea:条件に応じたJUnitテストクラステンプレート

たとえば、すべての私のサービス・テストは、クラス宣言の下に次の注釈を持っている:

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = NONE) 

すべてのコントローラテストは、これらのアノテーションを持っている:

@RunWith(SpringRunner.class) 
@WithMockUser 
@WebMvcTest(controllers = MyController.class) 

別のテストは異なるセットアップを持っている、など

テストを作成するたびに、この部分を別のテストからコピー・ペーストする必要があります。

私はこのプロセスをIntelliJ Ideaで自動化するのに役立つソリューションを探しています。

Q:JUnit Test Classテンプレートは、テストの種類によって異なる動作をする方法はありますか?クラス名は「コントローラ」で終わる場合、1つのテンプレートを使用する必要があり、その生成されたテスト - -

のは、クラス名が「サービス」という言葉で終わっているとしましょう、別のものを使用する必要があり、そのテストなどそれはすることも可能である

パッケージ名やクラス内容などのその他の条件でテストタイプを検出します。

+1

私はそれが可能ではないと思います。私は個人的に「通常の」「@ RunWith」などを挿入するために「ライブテンプレート」(https://www.jetbrains.com/help/idea/creating-code-constructs-by-live-templates.html)を使用します。他のもの –

+0

@RC私はそれについて考えていない、 –

答えて

5

JUnitコード生成テンプレートは、[設定]> [ファイルとコードテンプレート]> [コード]にあります。

実際に別々のコードテンプレートを作成することはできませんが、既存のテンプレートにロジックを追加するだけで済みます。 Velocityベースのディレクティブを使用します。

import static org.junit.Assert.*; 
#parse("File Header.java") 

public class ${NAME} { 
    ${BODY} 
} 

我々は次にそれを修正することができます:場合 だから、例えば、我々は既存のJUnit 4のテンプレートを取る

import static org.junit.Assert.*; 
#if($CLASS_NAME.contains("Service")) 
//Import whatever you need for services here. 
#end 
#if($CLASS_NAME.contains("Controller")) 
//Import whatever you need for controllers here. 
#end 
#parse("File Header.java") 
#if($CLASS_NAME.contains("Controller")) 
#set($CLASS_SUFFIX = ".class") 
@RunWith(SpringRunner.class) 
@RunWithMock 
@WebMvcTest(controllers = $CLASS_NAME$CLASS_SUFFIX) 
#end 
#if($CLASS_NAME.contains("Service")) 
@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = NONE) 
#end 
public class ${NAME} { 
    ${BODY} 
} 

この方法であなたはを通して新しいのJUnit 4のテストクラスを生成する場合(テストするクラスのクラス名にaltキーを押し、新しいテストを生成する)、テストするクラスの名前に 'Controller'または 'Service'が含まれていると、別の出力が生成されます。使用する命名規則に応じて、containsの代わりにendswithに変更することができます。 両方のケースで実際のインポートステートメントを省略しましたが、それらを追加できると確信しています。

+2

これはクールです:) –

関連する問題