1.例:
輸入org.apache.commons.logging.Log;
輸入org.apache.commons.logging.LogFactory。
輸入org.junit.Before;
輸入org.junit.runner.RunWith;
輸入org.springframework.beans.factory.annotation.Autowired;
輸入org.springframework.http.MediaType。
輸入org.springframework.test.context.ContextConfiguration。
輸入org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
輸入org.springframework.test.context.transaction.TransactionConfiguration。
輸入org.springframework.test.context.web.WebAppConfiguration。
輸入org.springframework.test.web.servlet.MockMvc;
輸入org.springframework.test.web.servlet.RequestBuilder。
輸入org.springframework.test.web.servlet.ResultActions。
輸入org.springframework.test.web.servlet.setup.MockMvcBuilders。
輸入org.springframework.transaction.annotation.Transactional;
輸入org.springframework.web.context.WebApplicationContext;
輸入静的org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get。
輸入静的org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post。
輸入静的org.springframework.test.web.servlet.result.MockMvcResultHandlers.print。
輸入静的org.springframework.test.web.servlet.result.MockMvcResultMatchers.status。
/ **
* 16/8/11にzhengcanruiによって作成されます。
* /
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(位置= { "クラスパス:春/ applicationContext- * XML"})
//構成ロールバック・トランザクション、データベースへの追加や削除がリサイクルテスト容易にするために、ロールバックされる
で@TransactionConfigurationエントリ(真defaultRollbackへ=「のTransactionManager」のTransactionManagerを、=)
@Transactional
//二つの効果以上の私たちは、このようなデータベースの追加操作として、データベーストランザクションのロールバックを操作する方法の終了後、我々はデータベース//メイクの操作を取り消すことです。
//なぜトランザクションのロールバック?
- //、ダーティデータを持つことになり、データベースの動作をテスト我々のデータの精度に影響を与えます
- 今回我々は、レコードが削除されることになるならば、ある//便利なテストサイクルは、レコードが削除されているので、もはや、JUnitテストになります次回は、それがスローされます。
- あなたは、トランザクションのロールバックを使用しない場合は、//、我々はより多くのテストと独立したコードになります、コード内のデータベース・リカバリ操作に私たちの追加と削除について明確な必要があります
@WebAppConfiguration
パブリックTestクラス{
//構成log4j.properties、コマンドライン出力レベルデバッグが覚え
ロガー= LogFactory.getLogログ(TestBase.class)を保護します。
MockMvc mockMvcを保護。
@Autowired
保護WebApplicationContextのWAC。
@Before()//この方法は、一度前の各メソッド実行に実行される
パブリックボイドセットアップ(){
mockMvc = MockMvcBuilders.webAppContextSetup(WAC).buildを(); //初期化MockMvcオブジェクト
}
org.junit.Test @
ます。public void getAllCategoryTest()例外{スロー
文字列responseString = mockMvc.perform(
GET( "/カテゴリー/ getAllCategory")// URLリクエスト、リクエストメソッドがGET
.contentType(MediaType.APPLICATION_FORM_URLENCODED)//をデータフォーマット
.PARAM( "Pコード"、 "ルート ")// パラメータを追加
).andExpect(ステータス()。ISOK ())// 戻り状態200である
.andDo(印刷())//プリントアウト要求、および対応するコンテンツ
.andReturn()てgetResponse()getContentAsString( ); ... // 文字列に対応する変換データ
のSystem.out.println( "--------返さJSON =" + responseString)。
}
}
Spring MVCのテストは、多くの場合、より複雑なようです。実際に、彼の別のは、彼が私たちの要求と応答をシミュレートするためのServletContextを必要としていることです。Spring MVCのための春だけでなく、私たちのセルカバレッジのテストを容易にするために、アナログテストインタフェース要求と応答を提供し、サービス、DAO層だけではありません。
2、コードの説明:
@webappconfigurationは、試験荷重のApplicationContext統合WebApplicationContextを宣言するためのコメントです。役割は、シミュレートのServletContextにあります
@ContextConfiguration:のような成分とコントローラが使用注釈であるため、注釈を指定し、対応するコンフィギュレーション、クラス初期化をスキャンし、スプリングの設定ファイルを必要としました。
メソッドの分析:
私たちは、送信操作を追加し、クラスが定義されてsoftinfoに次のように、softinfoにオブジェクトを追加します。
パブリッククラスsoftinfoに{ プライベート文字列ID; プライベート文字列名; }
あなたが追加した後、我々はテストユニット持っていたので、ロールバックされたトランザクションを、私たちはもはや私達のデータベースたちの追加操作で見られません、私たちは、操作が成功したかどうかを判断することはできません。
上記課題を解決するために、我々は、操作が成功した追加されているかどうかを判断するために、データにJSON形式のデータフィールドを、「データ」フィールドに返されたJSONデータを追加し解析することができます。次のようなJSON形式は次のとおりです。
{ "ステータス":200、 "データ":{ "ID": "2"、 "名前": "测试"} }
私たちは、判決、データ内の「$属性」GETによって返されるデータのandExpect方法を使用することができ、私は戻り値のデータ「data.name」を取得したいと、「$ .data.name」と書くことができます。次の例は、=戻りdata.nameを決定することで、「テスト」。
@Test ます。public void testCreateSeewoAccountUser()例外{スロー mockMvc.perform(ポスト( "/ユーザ") .contentType(MediaType.APPLICATION_FORM_URLENCODED) ).andExpect(ステータス()。ISOK()) .andExpect(jsonPath( "$。データを。名前」、である( "测试")))) .andExpect(jsonPath( "$ data.createTime"、notNullValue()))。 ; }
3、問題が発生しました
- 実行:RequestBuilder要求を行う、自動的SpringMVCを実行し、処理対応するプロセス制御装置が実行にマッピングされました。
- 取得:get要求の宣言を送信する方法を。MockHttpServletRequestBuilder GET(文字列urlTemplate、オブジェクト... URLVariablesオブジェクト): URI URIテンプレートと変数に応じてGETリクエストメソッドに価値があります。ポスト、PUT、削除など:また、のような要求の他の方法が、提供されます。
- PARAM:例えばPCODE =ルートに上記のパラメータを持って要求を送信する際に追加のリクエストパラメータ。あなたが使用する必要がある場合は、送信データフォーマットJSONをこのように使用する場合には、背後に表示されません注釈付きソリューションパラメータ@ResponseBody
- andExpectは:ResultMatcher検証ルールを追加し、制御を行うには、検証結果が正しい(返されたデータの判定を)
- andDo:そのようなデバッグコンソール(返されたデータの判定)に印刷するように、プロセッサのResultHandler結果を追加します。
- andReturn:最後に対応MvcResultを返し、カスタム認証、次のステップ(返されたデータの決意)の/非同期処理。
3は、背景データが返され、それは我々が、データベースの変更の結果を返すフロントエンドを持参することが好ましいです。
なぜに戻る変更またはデータオブジェクトに追加
- 遠位先端部へのデータバックを容易に追加したり、正常にデータを変更するかどうかを決定します
- データが頻繁にページを更新する必要があり、直接フロントエンド、フロントエンドにデータを取得するための要求を送信する必要はありません最後の更新や追加
- ユニットテストは、データベースのDDLができた場合(CRUD)操作は、私たちの事業が成功するかどうかを判断するためのデータを、確認することができます。次の例のように:
1、@ResponseBodyが400エラーになるまで特定されたパラメータを送信します。即ち、コントローラJSON層のないデータ伝送フォーマット。
回避策1
softinfoにsoftinfoに=新しいsoftinfoに();
//设置值
ObjectMapperマッパー=新しいObjectMapper();
。ObjectWriter OW = mapper.writer()withDefaultPrettyPrinter();
java.lang.StringでrequestJson = ow.writeValueAsString(softinfoに)。
ストリングresponseString = mockMvc.perform(ポスト( "/●ジャンル")のcontentType(MediaType.APPLICATION_JSON).content(requestJson))。andDo(プリント())
.andExpect(ステータス()。ISOK())。andReturn()。 。てgetResponse()getContentAsString();
解決策2:com.alibaba.fastjson.JSONObjectデータオブジェクトを使用しては、JSON変換され、
softinfoにsoftinfoに=新しいsoftinfoに();
// ...设置值
文字列requestJson = JSONObject.toJSONString(folderInfo)。
ストリングresponseString = mockMvc.perform(ポスト( "/●ジャンル")のcontentType(MediaType.APPLICATION_JSON).content(requestJson))。andDo(プリント())
.andExpect(ステータス()。ISOK())。andReturn()。 。てgetResponse()getContentAsString();
(注)上記の必要性のcontentTypeがMediaType.APPLICATION_JSONられていること、すなわち、送信データは、「アプリケーション/ JSON」形式を宣言されます。コンテンツを使用する方法は、身体の要求にJSONにデータを変換します。
2、java.lang.NoClassDefFoundErrorが:COM / jayway / jsonpath / InvalidPathException
ジャーパッケージの欠如:
あなたは何にMavenの依存を追加することができます
<依存性>
<のgroupId> com.jayway.jsonpath </のgroupId>
<たartifactId> JSONパス</たartifactId>
<バージョン> 0.8.1 </バージョン>
<スコープ>テスト</スコープ>
</依存>
<依存性>
<のgroupId> com.jayway.jsonpath </のgroupId>
<たartifactId> JSONパスアサート</たartifactId>
<バージョン> 0.8.1 </バージョン>
<スコープ>テスト</スコープ>
</依存>