SpringテストでのWebAppConfiguration

1概要

この記事では、Springの @ WebAppConfiguration アノテーションについて説明します。統合テストでそれが必要な理由と、これらのテストが実際に WebApplicationContext をブートストラップするように設定する方法を説明します。

2 @ WebAppConfiguration

簡単に言うと、これはSpring FrameworkでWeb版のアプリケーションコンテキストを作成するために使用されるクラスレベルのアノテーションです。

テスト用にブートストラップされる ApplicationContext は、 WebApplicationContext のインスタンスである必要があることを示すために使用されていました。

使い方についての簡単なメモ - WebApplicationContext MockMvc オブジェクトを構築するために使用されるので、通常、このアノテーションは統合テストにあります。 Springでの統合テストについてのより多くの情報を見つけることができます ここ

3 WebApplicationContext をロードする

Spring 3.2以降、統合テストで WebApplicationContext をロードするためのサポートが追加されました

@WebAppConfiguration
@ContextConfiguration(classes = WebConfig.class)
public class EmployeeControllerTest {
    ...
}

これは、テスト用に WebApplicationContext をロードする必要があることを TestContext フレームワークに指示します。

そして、バックグラウンドで MockServletContext が作成され、 TestContext フレームワークによってテストの WebApplicationContext に提供されます。

3.1. 設定オプション

デフォルトでは、 WebApplicationContext のベースリソースパスは__“ file:src/main/webapp”に設定されます。これはMavenプロジェクト内のWARのルートのデフォルトの場所です。

ただし、 @ WebAppConfiguration アノテーションへの代替パスを単に提供することでこれをオーバーライドできます。

@WebAppConfiguration("src/test/webapp")

ファイルシステムの代わりにクラスパスからベースリソースパスを参照することもできます。

@WebAppConfiguration("classpath:test-web-resources")

3.2. キャッシング

WebApplicationContext がロードされると、それはキャッシュに入れられ、同じテストスイート内で同じ固有のコンテキスト設定を宣言する後続のすべてのテストに再利用されます。

キャッシュの詳細については、リファレンスのhttp://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#testcontext-ctx-management-cachingマニュアル。

4テストで @ WebAppConfiguration を使用する

テストクラスになぜ @ WebAppConfiguration アノテーションを追加する必要があるのか​​が理解できたので、 WebApplicationContext を使用しているときに 追加しないとどうなるか を見てみましょう。

@RunWith(SpringJUnit4ClassRunner.class)//@WebAppConfiguration omitted on purpose
@ContextConfiguration(classes = WebConfig.class)
public class EmployeeTest {

    @Autowired
    private WebApplicationContext webAppContext;
    private MockMvc mockMvc;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build();
    }

    ...
}

注釈を追加し忘れたシナリオをシミュレートするために注釈をコメントアウトしたことに注意してください。ここで、JUnitテストを実行するとなぜテストが失敗するのかが簡単にわかります。** WebApplicationContext を、 __. __を設定していないクラスで自動配線しようとしています。

ただし、より一般的な例は、Web対応のSpring構成を使用するテストです。実際にテストを中断するのに十分です。

みてみましょう:

@RunWith(SpringJUnit4ClassRunner.class)//@WebAppConfiguration omitted on purpose
@ContextConfiguration(classes = WebConfig.class)
public class EmployeeTestWithoutMockMvc {

    @Autowired
    private EmployeeController employeeController;

    ...
}

上記の例では WebApplicationContext を自動配線していませんが、Web対応の設定 - WebConfig を使用しようとしているので失敗します。

@Configuration
@EnableWebMvc
@ComponentScan("com.baeldung.web")
public class WebConfig implements WebMvcConfigurer {
    ...
}

アノテーション @ EnableWebMvc はここでの原因です - それは基本的にWeb対応のSpringコンテキストを必要とします、そしてそれなしで - 私たちはテストが失敗するのを見るでしょう:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
  No qualifying bean of type[javax.servlet.ServletContext]found for dependency:
    expected at least 1 bean which qualifies as autowire candidate for this dependency.

Dependency annotations:
  {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at o.s.b.f.s.DefaultListableBeanFactory
      .raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373)
    at o.s.b.f.s.DefaultListableBeanFactory
      .doResolveDependency(DefaultListableBeanFactory.java:1119)
    at o.s.b.f.s.DefaultListableBeanFactory
      .resolveDependency(DefaultListableBeanFactory.java:1014)
    at o.s.b.f.a.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement
      .inject(AutowiredAnnotationBeanPostProcessor.java:545)
    ... 43 more

そのため、テストに @ WebAppConfiguration アノテーションを追加することで簡単に解決できる問題です。

5結論

この記事では、アノテーションを追加するだけで、 TestContext フレームワークから WebApplicationContext を統合テストにロードする方法を説明しました。

最後に、テストに@ ContextConfiguration を追加しても、 @ WebAppConfiguration アノテーションを追加しない限り、これは機能しないという例を調べました。

この記事の例の実装は、https://github.com/eugenp/tutorials/tree/master/spring-mvc-java/src/test/java/com/baeldung/web/controllerのリポジトリにあります。 GitHub]。