1. 概要

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

2. @WebAppConfiguration

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

これは、テスト用にブートストラップされるApplicationContextWebApplicationContextのインスタンスであることを示すために使用されます。

使用法に関する簡単なメモ– WebApplicationContextMockMvcオブジェクトの構築に使用されるため、通常、統合テストでこのアノテーションが見つかります。 Spring との統合テストの詳細については、こちらをご覧ください。

3. WebApplicationContextを読み込んでいます

Spring 3.2以降、統合テストWebApplicationContextをロードできるようになりました。

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

これは、 TestContext フレームワークに、WebApplicationContextをテスト用にロードするように指示します。

また、バックグラウンドで 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 が読み込まれると、キャッシュされ、同じテストスイート内で同じ一意のコンテキスト構成を宣言する後続のすべてのテストで再利用されます。

キャッシングの詳細については、リファレンスマニュアルのコンテキストキャッシングセクションを参照してください。

4. テストでの@WebAppConfigurationの使用

テストクラスに@WebAppConfigurationアノテーションを追加する必要がある理由がわかったので、WebApplicationContext[を使用しているときにを追加し忘れた場合にがどうなるかを見てみましょう。 X209X]。

@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アノテーションを追加しないと機能しないという例を確認しました。

この記事の例の実装は、GitHubのリポジトリで入手できます。