2017-11-06 6 views
0

クラスBから拡張するテストクラスAがあるとします。@BeforeClassテストメソッドによって呼び出される静的メソッドでBeanを使用する方法

@BeforeClass 
public static void setUp(){ 
    createFakeData(); 
} 

createFakeData()クラスBであり、その機能は、データベース内のオブジェクトを作成することである方法:このクラスA@BeforeClassアノテーションと一つの方法を有しています。

public FakeData createFakeData() throws Exception 
{ 
    return dummyObjectsFactory.createFakeData(); 
} 

:FakeDataオブジェクトを返します。そのようなことかもしれない

@Autowired 
private DummyObjectsFactory dummyObjectsFactory; 

そして方法createFakeData()の内容:

はそのために、私はクラスBで豆を持っています私が直面している問題は、@BeforeClassメソッドが静的でなければならないということです。つまり、メソッドも静的でなければなりません。しかし、私の豆dummyObjectsFactoryは常にnullになるので、そのメソッドを静的に設定することはできません。

私のメソッドを静的にして、私のdummyObjectsFactory beanがnullでないのを防ぐことができますか?

+0

「B」のインスタンスをどこかに作成する必要があります。これは 'A'のメソッドが'静的 'なのかどうかという疑問とは関係がありません。 – Holger

+0

私が言ったように、私のクラス 'A'は' B'から拡張されます –

+0

これは単位テストを作成する方法ではありません。しかし、それでも、A.setUp()内で新しい 'B'インスタンスを作成することを止めることはありません。 – Holger

答えて

0

私が知る限り、これはJUnitでは許可されていません。しかし、あなたはそれを手配するためにいくつかのことをすることができます。

まず、TestNGを使用して、必要なものを正確に行うことができます。

これはオプションではない場合は、@BefloreClassアノテーションを使用する代わりに、@Beforeを使用できます。両方の違いは、すべてのテストの前に@BeforeClassがメソッドを実行し、@Beforeは各テストの前にメソッドを実行することです。 @Beforeを使用している場合は、データベースに保存されているデータを削除するために、@Transactionalというクラスに注釈を付けます。最後に

、あなたが各テストのためのメソッドを実行したくない場合は、あなたが@Before、フラットコール使用することができます。

@Before 
public void init(){ 
    if(!fakeDataCalled){ 
     createFakeData(); 
     fakeDataCalled=true; 
    } 
} 
0

を私はあなたのテストクラス(B)の注釈を付けたいと考えています@RunWith(SpringRunner.class)となり、自動配線が正しく行われます。

Spring Referenceの15.4.4項を参照してください。 あなたはまた、単にそのページを参照し、「RunWith」

警告を検索することができます。

  1. 私は静的メソッドを好きではありません。ユニットテストを困難にする傾向があります。
  2. 私は他のテストを行うためにテストを拡張したくありません。各テストをスタンドアロンにして共有機能(つまり、テストソースツリーにある共有テスト機能用のユーティリティクラスを作成する)にコンポジションを使用する方が簡単です。
  3. autowiringによって私のユニットテストが嫌いです。すべての依存関係を模擬し、リフレクションまたは@InjectMocksアノテーションを挿入します。
関連する問題