Spring Web MVCフレーム(11)Spring Web MVCテストフレームワーク

7426 ワード

Springは完璧なテストフレームも提供しています.Spring Web MVCアプリケーションを簡単にテストできます.このテストフレームを使用するためには、その依存項を追加する必要があります.
compile group: 'org.springframework', name: 'spring-test', version: '4.3.6.RELEASE'
サービスエンドテスト
Springで提供されたMockオブジェクトを利用して、私たちのSpringプログラムの動作をテストすることができます.これらのMockオブジェクトを通して、私たちは偽のサーバーを作って、いくつかの偽の要求を送信して、私たちのプログラムをテストします.試験コードを簡潔に作成できるように、コードの中で静的導入を使用したほうがいいです.MockMvcRequestBuilders.*MockMvcResultMatchers.*MockMvcBuilders.*をコードに導入します.
テスト環境を設定
Spring Web MVCを構築するためのテスト環境は、通常のSpringユニットテストとは少し違っています.私たちは@WebApple Configrationを使ってテストクラスを注釈する必要があります.SpringはこれがWeb MVCテストだと知ってから、@Contect Configrationの注釈中のプロファイルを使ってWebApplication Controtextを作成して、テストクラスに注入できます.そしてやるべきことはMockMvcオブジェクトを作ることです.ほとんどのテストはその対象を通して行います.
@RunWith(SpringRunner.class)
@WebAppConfiguration
@ContextConfiguration("file:src/main/webapp/WEB-INF/applicationContext.xml")
public class UserControllerTest {
    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

    @Before
    public void init() {
        mvc = MockMvcBuilders.webAppContextSetup(context).build();
    }
}

もちろん、あるコントローラをテストするだけで、完全なプロファイルをロードしなくてもいいです.この場合は、あるコントローラはMockMvcBulders.standalneSetupを使用してSpringデフォルト設定のみを使用することができます.
public class SimpleTests {

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.standaloneSetup(new AccountController()).build();
    }

}
請求を始める
コードの中で上記のクラスを静的に導入したと仮定します.
私たちはMockMvcのperform方法を使ってHTTP要求を開始しました.この要求はget、postなどであってもいいです.そして、acceptなどの情報を設定してもいいです.
mockMvc.perform(post("/users/{id}", 42).accept(MediaType.ALL));
もちろん、ファイルアップロード要求を開始することもできます.
mockMvc.perform(fileUpload("/upload").file("file", file.getBytes("UTF-8")));
私たちは直接要求にパラメータを含めることができます.
mockMvc.perform(get("/users?user={foo}", "bar"));
パラム法を用いてパラメータを伝達することもでき、このようにPOSTフォームデータを伝達することができる.
mockMvc.perform(post("/users").param("foo", "bar"));
必要があれば、私達はまた要求のためにcontextPathとservletPathを追加することができます.
mockMvc.perform(get("/myproject/contextpath/users").contextPath("/myproject").servletPath("/contextpath"))
結果を期待する
要求を開始したら、私たちは要求が正しいかどうかを検証する必要があります.この場合はperformメソッドの後にand Expectメソッドを呼び出す必要があります.様々な結果が期待できます.最も一般的なのは様々な応答コードを得ることです.以下の例はトップページが正常にアクセスできることを期待しています.もちろん、status()方法は、他の応答コード方法を提供して、私たちの需要を満たす.
mockMvc.perform(get("/index")).andExpect(status().isOk());
結果が期待されるメディアタイプもある.
mvc.perform(get("/users.xml"))
        .andExpect(status().isOk())
        .andExpect(content().contentType(MediaType.APPLICATION_XML));
検証要求が戻ってくるモデルが必要な場合があります.例えば、以下のように結果に誤りがあると断言します.
mockMvc.perform(post("/updateInfo"))
    .andExpect(status().isOk())
    .andExpect(model().attributeHasErrors("user"));
要求または応答の内容を確認する必要がある場合があります.Springが提供するprintまたはlog方法を呼び出して情報を印刷したりログを記録したりすることができます.デフォルトの場合、print方法は結果をSystem.outに出力し、log方法はログをデバッグレベルのorg.springframework.test.web.servlet.resultに記録する.
mockMvc.perform(post("/updateInfo"))
    .andExpect(status().isOk())
    .andDo(print())
    .andExpect(model().attributeHasErrors("user"));
詳細なチェックが必要な場合があります.すべての所望の方法の最後にand Return方法を追加することができます.この方法はMvcResultオブジェクトに戻ります.このオブジェクトの様々なget方法を呼び出して、私たちが必要とする情報を得ることができます.
MvcResult mvcResult = mockMvc.perform(post("/listUsers")).andExpect(status().isOk()).andReturn();
いくつかの期待があるなら、すべての方法が必要です.私たちはそれを共用に設定できます.設定したら変更できません.ですから、もし私たちが共有したいと思わないなら、新しいMockMvcオブジェクトを作るしかないです.
standaloneSetup(new UserController())
    .alwaysExpect(status().isOk())
    .alwaysExpect(content().contentType("application/json;charset=UTF-8"))
    .build()
私たちが単一のコントローラにフィルタを追加したいなら、MockMvcオブジェクトを作る時にフィルタを指定できます.
mockMvc = standaloneSetup(new UserController()).addFilters(new CharacterEncodingFilter()).build();
スプリング-mvc-showcaseはSpring公式に開発された例示的なプログラムであり、Spring Web MVCの例と基本機能を含み、すべてのサービスエンドテストコードも含まれています.これもいい勉強資源です.
Htmlユニット統合
MockMvcは使いやすいですが、やはり偽のテストです.実際に実行しているサーバーがなく、実際のビューレンダリング、転送、リダイレクトなどの操作もしません.実際のHTMLビュー、JavaScript検証などの機能をテストしたいなら、Html Unitを使う必要があります.
私たちはプロジェクトにHtml Unitの依存を引用する必要があります.
compile group: 'net.sourceforge.htmlunit', name: 'htmlunit', version: '2.24'
そしてWebCientを初期化します.
@Autowired
WebApplicationContext context;

WebClient webClient;

@Before
public void setup() {
    webClient = MockMvcWebClientBuilder
        .webAppContextSetup(context)
        .build();
}
このように設定すると、デフォルトのすべてのlocalhostの下の要求は自動的にMockMvcオブジェクトを通してアクセスされ、実際のHTTP接続は必要ないです.これは本機のテストに便利です.他のドメイン名は正常にネットワークを使って接続されます.CDNなどの状況をテストさせてくれます.
そして私たちはWebCientを使ってテストを作成できます.ここで私は直接Spring文書の例を貼りました.例から見ると、WebClientの使い方は普通のJavaScriptを使ってDOMを操作するのと同じです.以下は作成要求コードです.
HtmlForm form = createMsgFormPage.getHtmlElementById("messageForm");
HtmlTextInput summaryInput = createMsgFormPage.getHtmlElementById("summary");
summaryInput.setValueAttribute("Spring Rocks");
HtmlTextArea textInput = createMsgFormPage.getHtmlElementById("text");
textInput.setText("In case you didn't know, Spring Rocks!");
HtmlSubmitInput submit = form.getOneHtmlElementByAttribute("input", "type", "submit");
HtmlPage newMessagePage = submit.click();
以下は検証を実行するコードです.ここでの断言はアッシュライブラリを使用しています.
assertThat(newMessagePage.getUrl().toString()).endsWith("/messages/123");
String id = newMessagePage.getHtmlElementById("id").getTextContent();
assertThat(id).isEqualTo("123");
String summary = newMessagePage.getHtmlElementById("summary").getTextContent();
assertThat(summary).isEqualTo("Spring Rocks");
String text = newMessagePage.getHtmlElementById("text").getTextContent();
assertThat(text).isEqualTo("In case you didn't know, Spring Rocks!");
ここから私達は直接Html Unitを使う欠点を見ることができます.Springはまた、HtmlUnitのテストプロセスを簡単にするために、他の2つのクラスのWebDriverとGebを提供しています.Spring参照文書Html Unitの統合を参照してください.
クライアントのRESTテスト
クライアントテストRESTプログラムが必要ならば、Springも関連機能を提供します.Springオフィシャルの例を直接見てみます.私たちはまずRestTemplateオブジェクトを作成して、MockReserviceServerを作成して、Rets Templateにバインドする必要があります.そしてMockReserviceServerのexpect方法を使って要求を行い、結果をテストします.最後にverifyメソッドを呼び出して、すべての期待を満たすかどうかを検証します.この方式は実際のサーバーを起動する必要がなく、効率が高いです.
RestTemplate restTemplate = new RestTemplate();

MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting")).andRespond(withSuccess());

//   RestTemplate       ...

mockServer.verify();
クライアントテストは、サービステストと結合することもできます.私たちはMockMvcオブジェクトを利用してRestit Templateを作成することができます.そうすると、実際のサーバを起動する必要がなく、サービス端末の論理を使ってコードをテストします.
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
this.restTemplate = new RestTemplate(new MockMvcClientHttpRequestFactory(mockMvc));

//   RestTemplate       ...

mockServer.verify();
参考資料
Spring参考文献15.6.Spring MVC Test Framewark