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]。