5

私のメソッドでいくつかの Web スコープをスプリング コンテキストに登録したいと思います@BeforeTest。しかし、春のコンテキストはまだnullその時点にあることがわかりました。

ただし、に変更すると、テストは正常に実行され@BeforeMethodます。@BeforeTestテスト メソッドごとにスコープ登録コードを繰り返したくないので、 のコンテキストにどのようにアクセスできるのだろうか。

以下は私のコードスニペットです。

public class MyTest extends MyBaseTest {
    @Test public void someTest() { /*...*/ }
}

@ContextConfiguration(locations="/my-context.xml")
public class MyBaseTest extends AbstractTestNGSpringContextTests {
    @BeforeTest public void registerWebScopes() {
        ConfigurableBeanFactory factory = (ConfigurableBeanFactory)
                this.applicationContext.getAutowireCapableBeanFactory();
        factory.registerScope("session", new SessionScope());
        factory.registerScope("request", new RequestScope());
    }   

    /* some protected methods here */
}

テスト実行時のエラーメッセージは次のとおりです。

失敗した構成: @BeforeTest registerWebScopes
java.lang.NullPointerException
    my.MyBaseTest.registerWebScopes (MyBaseTest.java:22) で
4

2 に答える 2

12

springTestContextPrepareTestInstance()BeforeTest メソッドを呼び出します。

于 2012-07-03T17:16:04.863 に答える
3

TestNG は@BeforeTestメソッドの前に@BeforeClassメソッドを実行します。にspringTestContextPrepareTestInstance()注釈が付けられ@BeforeClass、 が設定されます applicationContextapplicationContextこれが、がまだメソッドnull内にある理由です。タグ付けされたテストのグループを wapping するためのものです。(各メソッドの前に実行されるわけではないため、少し誤解があります)。@BeforeTest@BeforeTest@Test

を使用する代わりに@BeforeTest、おそらく(現在のクラス@BeforeClassの最初の前に 1 回実行される) を使用する必要があります。次のように、メソッド@Testに依存していることを確認してくださいspringTestContextPrepareTestInstance

@BeforeClass(dependsOnMethods = "springTestContextPrepareTestInstance")
public void registerWebScopes() {
    ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
            this.applicationContext.getAutowireCapableBeanFactory();
    factory.registerScope("session", new SessionScope());
    factory.registerScope("request", new RequestScope());
}   

メソッドの@BeforeMethod後に実行されるため、(あなたが述べたように) も機能します@BeforeClass

于 2014-07-22T20:07:29.690 に答える