3

既に spring-test と JUnit を使用している Spring Web MVC プロジェクトにCucumberを追加しようとしています。既に作成した Cucumber 以外の統合テストには、WebApplicationContext が自動配線されており、MockMvcfor each テストを作成しています。私が作業しようとしているCucumberの例MockMvcでは、ステップ定義クラスの存続期間中に 1 回注入します。

MockMVCのAPI ドキュメントでは、呼び出しによってインスタンスがどのようにperform変更されるか、および複数のテストでインスタンスMockMvcを再利用することが許容されるかどうかについてのガイダンスは提供されていません。また、リファレンス ドキュメントMockMvcで明確な答えを見つけることができませんでした。

との契約はMockMvc?テストごとに新しいものを作成する必要がありますか?

4

2 に答える 2

3

のインスタンス変数を見てMockMvc、答えを推測できるかもしれません。

static String MVC_RESULT_ATTRIBUTE = MockMvc.class.getName().concat(".MVC_RESULT_ATTRIBUTE");

private final TestDispatcherServlet servlet;

private final Filter[] filters;

private final ServletContext servletContext;

private RequestBuilder defaultRequestBuilder;

private List<ResultMatcher> defaultResultMatchers = new ArrayList<ResultMatcher>();

private List<ResultHandler> defaultResultHandlers = new ArrayList<ResultHandler>();

インスタンス/クラス変数MVC_RESULT_ATTRIBUTEおよびTestDispatcherServletはスレッドセーフでありfiltersservletContext初期化中にのみ設定されます。 filtersまた、servletContextスレッドセーフでステートレスであるべきです。defaultRequestBuilder、セッターメソッドがありますdefaultResultMatchersdefaultResultHandlers技術的な観点からMockMvcは、スレッドセーフではなく、再利用すべきではありません。これらのセッターはパッケージ プライベートであり、MockMvcインスタンスは を介し​​てのみ取得できますMockMvcBuildersMockMvcしたがって、後でインスタンスを操作して、複数のテストで実際に再利用できるようにすることはできません。

于 2015-12-22T10:00:01.767 に答える
3

MockMvc は一度作成すると、任意の数のリクエストに使用できます。

于 2015-12-22T19:42:31.503 に答える