ジャージーレストサービスを備えた春のWebアプリケーションがあります。ただし、残りはスプリング セキュリティによって保護されており、単体テスト コードからログイン プロセスを実行するのは非常に困難です。春のセキュリティ全体を無効にして残りのサービスをテストしたいと思います。それは可能ですか?
3 に答える
pojoとしてテストするだけです。何を渡しても何を返しても、アプリ コンテキストをまったく読み込まないでください。これは統合テストになります。
フレームワークをロードせずに機能を簡単にテストできることは、Spring の重要な利点の 1 つです。
何が「難しい」とは言わないので、REST サービス、つまりテストしたい Java メソッドに何かがあり、認証結果が必要であると想定しています。Spring には、認証結果をモックするためのユーティリティがあります。たとえば、@Before
setup メソッドで次の操作を実行できます。
Object principal = null; // fix this
Object credentials = null; // fix this
Authentication auth = new org.springframework.security.authentication.TestingAuthenticationToken(principal, credentials);
SecurityContextHolder.getContext().setAuthentication(auth);
しかし、繰り返しになりますが、実際に解決しようとしている問題については言及していません...
アノテーション ベースの Web サービスの利点の 1 つは、それらを簡単に単体テストできることです。
class WebServiceEndpoint {
@Path("/foo/{fooId}")
@POST
@Produces({ MediaType.APPLICATION_XML })
public Response doFoo(@PathParam("fooId") Integer fooId) {
/// ... web service endpoint implementation
}
}
セキュリティに Spring のサーブレット フィルタを使用している場合は、メソッドにセキュリティ関連のコードを含めるべきではないdoFoo
ため、新しいWebServiceEndpoint
クラスを作成してメソッドを呼び出すだけで済みます。これは、セキュリティを「無効にする」方法の 1 つです。
ログインプロセスが「難しい」と言うとき、それはどういう意味ですか? 1 回ログインに成功した場合は、同じコードを他の単体テスト (@Before
メソッドなど) で再利用できます。