2

Spring のテスト ユーティリティ アノテーション ContextConfiguration を使用して Bean を作成する testng クラスが与えられた場合、Bean はテスト クラスの存続期間中に一度だけ作成されます。

これを使用する前は、常に @BeforeMethod を使用して、各 @Test メソッドの前にすべてを再構築していました。

私の質問: @Test メソッドごとに春に Bean を再構築する方法はありますか?

//The beans are unfortunately created only once for the life of the class.
@ContextConfiguration( locations = { "/path/to/my/test/beans.xml"})
public class Foo {

    @BeforeMethod
    public void setUp() throws Exception {
        //I am run for every test in the class
    }

    @AfterMethod
    public void tearDown() throws Exception {
        //I am run for every test in the class
    }

    @Test
    public void testNiceTest1() throws Exception {    }

    @Test
    public void testNiceTest2() throws Exception {    }

}
4

3 に答える 3

7

テストの実行ごとにコンテキストを再ロードする場合は、AbstractTestNGSpringContextTestsを拡張し、@ContextConfigurationに加えて@DiritesContextアノテーションを使用する必要があります。例:

@ContextConfiguration(locations = {
        "classpath:yourconfig.xml"
})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class YourTestClass extends AbstractTestNGSpringContextTests {
 //magic
}

Context.ClassMode.AFTER_EACH_TEST_METHODのクラスモードにより、各テストメソッドが呼び出された後にSpringがコンテキストをリロードします。DirtiesContext.ClassMode.AFTER_CLASSを使用して、各テストクラスの前にコンテキストをリロードすることもできます(すべてのSpring対応テストクラスのスーパークラスで使用するのに便利です)。

于 2013-01-22T16:00:41.140 に答える
1

もう 1 つの可能性は、プロトタイプ スコープの Bean を使用することです。テスト クラスがインスタンス化されるたびに、プロトタイプ スコープの Bean がインスタンス化され、接続されます。

JUnit と TestNG は、テスト クラスをいつインスタンス化するかについて、異なるロジックを使用することに注意してください。JUnit はすべてのメソッドに対して新しいインスタンスを作成し、TestNG はテスト インスタンスを再利用します。質問が TestNG に関するものであることを考えると、全体的な効果を得るには、テストを多くのテスト クラスに分解する必要があります。

于 2014-11-11T23:54:27.567 に答える
1

古い @BeforeMethod はおそらく正しい方法です。

@ContextConfiguration は、クラスレベルで Bean を注入することを目的としています。つまり、設計どおりに機能しています。

于 2012-05-24T03:26:08.547 に答える