9

spring mvc アプリケーションでコントローラーの統合テストを作成しようとしています。コントローラーは、サービス クラスを呼び出します。サービス クラスは、dao を呼び出して、リポジトリからデータを読み書きします。DAO は、いくつかの構成を検索する必要があります。構成 Bean は WEB-INF/applicationContext.xml で定義されます。

私はこのようなものを使用しています:

構成 config =(構成)ContextLoader.getCurrentWebApplicationContext().getBean("config");
private String 名前空間 = config.getProperty("someproperty");

プロパティは Zookeeper に保存されるため、Spring のプロパティ管理アーティファクトは使用していません。

問題は、JUnit テストの実行中に ContextLoader.getCurrentWebApplicationContext() が常に null を返すことです。

これまでのところ、次のアプローチを見て
まし
。question/8464919/unit-testing-a-servlet-that-depends-on-springs-webapplicationcontextutils-getre 4. Selenium/JWebunit を使用し ます。 5. http://confluence.highsource.org/display/Hifaces20/Hifaces20+Testing+package+ -+testing%2C+tracing+and+debugging+web+applications+with+Jetty


1 ではこの問題は解決しません。WebApplicationContext は null のまま
です 2 WebApplicationContext のサポートは Spring 3.2 で利用可能になると述べています
3. これは理解できません。testApplicationContext と getServletContext() はどこから取得できますか?
4. これは完全にブラックボックス テストであるため、この方法は使用したくありません。
5. 現在 5 を見ています。しかし、これにはサーブレット コンテナを起動する必要があります。他に代替手段はありませんか?

あなたが提供できるどんな助けにも感謝します。

ありがとうPixalSoft

@Ted Young SO は、私が言ったことを終わらせることを許しませんでした。 MockWebApplicationContextLoader のハンドルを取得するために何か特別なことをする必要がありますか?構成オブジェクトの注入は、シングルトン オブジェクトに対して機能します。しかし、すべてがシングルトンになることはできません。すべてのコンストラクターで構成オブジェクトを渡すのは面倒に思えます。今のところ、setter メソッドを介して自動配線された静的構成オブジェクトを持つクラスを作成しました。ApplicationContextAware.Many thx を見ていきます

4

4 に答える 4

5

WebApplication コンテキストを ContextLoderListner に手動で追加する必要があります。これは機能します。

@ContextConfiguration(locations = "classpath:module-test-beans.xml")
@WebAppConfiguration
public class SampleTest extends AbstractTestNGSpringContextTests {

    @Autowired
    private WebApplicationContext wac;

    @BeforeClass
    public void setUp() throws ServletException {
        MockServletContext sc = new MockServletContext("");
        ServletContextListener listener = new ContextLoaderListener(wac);
        ServletContextEvent event = new ServletContextEvent(sc);
        listener.contextInitialized(event);
    }

    @Test
    public void testMe() {
        Assert.assertFalse(ContextLoader.getCurrentWebApplicationContext() == null);
    }
}
于 2015-09-18T04:43:37.070 に答える
4

junit テストの先頭に次のコードを追加します。

MockServletContext sc = new MockServletContext("");
sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM,
        "/applicationContext-test.xml"); // <== Customize with your paths
ServletContextListener listener = new ContextLoaderListener();
ServletContextEvent event = new ServletContextEvent(sc);
listener.contextInitialized(event);

コンテキスト パスに複数の xml を追加する必要がある場合は、次のようにスペースで区切って同じ文字列に配置します。

sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM,
        "/applicationContext-test.xml /applicationContext-other.xml");
于 2013-02-12T11:00:03.843 に答える
1

ContextLoader.getCurrentWebApplicationContext が null を返す理由は、私の MockWebApplicationContextLoader を使用するときに、Web アプリケーション コンテキストもその特定の ContextLoader 実装も使用していないためです。

あなたのリポジトリは Spring によって管理されているので、単純に構成オブジェクトをリポジトリに注入してみませんか? config オブジェクトを注入することは、それにアクセスするための最も適切な方法です。その後、@PostConstruct で注釈が付けられたメソッドで名前空間プロパティを初期化できます。

または、DOA で ApplicationContextAware を実装して、構築中にアプリケーション コンテキストのコピーを受け取ることもできます。

于 2012-05-05T00:15:27.653 に答える
0

プロパティ ファイルをクラスパスに保存します。

次のように、コントローラー クラスでそのプロパティにアクセスします。

/*to access your filename.properties file */
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.properties"));

String  sServerLocation = properties.getProperty("key");

これで、プロパティ ファイルにアクセスできます。

私はそれがうまくいくと確信しています。

于 2012-05-04T09:15:34.030 に答える