2012-05-09 5 views
18

@PostConstructメソッドを持つクラスがある場合、JUnitとSpringを使用してコンストラクタとその@PostConstructメソッドをテストするにはどうすればよいですか? @PostConstructメソッドが起動されないため、新しいClassName(param、param)を単に使用することはできません。Springを使って@PostConstructメソッドを持つクラスのコンストラクタをテストするには?

私はここで何かが分かりませんか?

public class Connection { 

private String x1; 
private String x2; 

public Connection(String x1, String x2) { 
this.x1 = x1; 
this.x2 = x2; 
} 

@PostConstruct 
public void init() { 
x1 = "arf arf arf" 
} 

} 


@Test 
public void test() { 
Connection c = new Connection("dog", "ruff"); 
assertEquals("arf arf arf", c.getX1(); 
} 

@PostConstructメソッドはこれと似ていますが(少し複雑ですが)、ヒットしません。

答えて

11

Spring JUnit Runnerをご覧ください。

あなたのクラスをテストクラスに挿入する必要があります。これにより、Springがクラスを構築し、post構築メソッドを呼び出すようになります。ペットクリニックの例を参照してください。

例:デフォルトでは

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:your-test-context-xml.xml") 
public class SpringJunitTests { 

    @Autowired 
    private Connection c; 

    @Test 
    public void tests() { 
     assertEquals("arf arf arf", c.getX1(); 
    } 

    // ... 
+0

私はそれが私の言うとおりに理解します。しかし、このコンストラクタの複数の順列を1つのテストクラスの中でテストするにはどうすればよいですか?私の質問について明確にしていないのは何ですか? – AHungerArtist

+0

このクラスのコンストラクタに5つのテストケースが必要です。実際に、このような5つの豆を持つアプリコンテキストを持ち、それを読み込むよりも良い方法はありませんか? – AHungerArtist

+0

クラスにインジェクションする方法が5つある場合はリアルタイムで、その場合は5つのBean定義を作成する必要があると言います。 –

0

@PostConstructは、オブジェクトの状態を変更する必要があります。したがって、JUnitのテストケースでは、Beanを取得した後にオブジェクトの状態をチェックします。 @PostConstructで設定された状態と同じ場合、テストは成功です。

+0

問題は、それが変更されたことをテストする方法ではありませんが、@PostConstructは起動されません。私はそれをより明確にするために投稿を編集します。 – AHungerArtist

0

、春は@PostConstructと@PreDestroy注釈を認識しません。これを有効にするには、 'CommonAnnotationBeanPostProcessor'を登録するか、Bean設定ファイルで ''を指定する必要があります。

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

または

<context:annotation-config />

17

のみコンテナが管理Connectionの一部があなたの@PostContruct方法であれば、単に試験方法で手動でそれを呼び出す:

@Test 
public void test() { 
    Connection c = new Connection("dog", "ruff"); 
    c.init(); 
    assertEquals("arf arf arf", c.getX1()); 
} 

もしそこ依存関係のように、これ以上ですそれらを手動で、または - Sridharが述べたように - スプリングテストフレームワークを使用します。

+0

それは私がやったことです。 – AHungerArtist

+7

initはプライベートにすることができます –

+0

@shanyangqu次に、ReflectionTestUtilsまたは同等のものを使用することができます。それはテストコードafterallです。 – mrembisz

関連する問題