11

現在、単体テストに組み込み LDAP サーバーを使用しようとしています。

Spring Security では、指定された ldif からロードされたいくつかのサンプル データを含むタグを使用して、テスト用の組み込み LDAP サーバーをすばやく定義できます。

Spring LDAP を使用して LDAP 操作を実行し、ユーザー サービス オブジェクトの通常の CRUD 機能をテストすることを考えています。

ただし、実行中のテストごとに、組み込みサーバーのエントリが同じ一貫した状態 (すべて削除して ldif エントリをリロードするようなもの) であることを確認する方法はありますか?

私は次のことを考えました:1)メソッドがコンテキストを汚すことを示し、組み込みLDAPサーバーの再作成を強制します。これは、メソッドごとにサーバーを再起動する必要があるため、苦痛に聞こえます2)テスト組織でテストエントリを作成します、それらをバインド解除して、そこにあるldifファイルに単純にロードできるようにします。

私は 2 を好みますが、Spring LDAP には、ldif ファイルのコンテンツを読み込んで送信するための適切なヘルパーがないようです。

春の組み込み LDAP サーバーを使用して LDAP テストを実行する方法、または私が言及した 2 つの可能な解決策について何か提案はありますか?

ありがとう

4

4 に答える 4

4

Spring LDAP は、LDAP 操作に関するトランザクション制御を提供しませんか? もしそうなら、自動ロールバック機能を備えた Spring テスト フレームワークを使用してみませんか?

また、LDAP リポジトリをラップしてリレーショナル データベースとして表示する JDBC-LDAP ブリッジ ドライバについても知っています。私はこれに接続するために iBatis を使用しました (これについてはhttp://lokibear.blogspot.comに書いています。7 月の記事を参照してください)。私はまだトランザクション制御を適用しようとはしていませんが、ドライバーの Web サイトには、トランザクションを無視する機能について言及されています (つまり、トランザクションを無視することもできません... ですよね?)。

私が言うように、私はまだこれを試していません。ただし、これが LDAP に関するトランザクションを提供する場合は、Spring テスト フレームワークを再度使用して自動ロールバックを行うことができます。私はそのフレームワークに関する簡単なチートシートを公開しました - 私のブログの 9 月の投稿を参照してください。

申し訳ありませんが、ここで目標を達成できていない可能性があります。しかし、おそらくこれらの提案は役に立ちます。幸運を!

于 2009-09-16T21:59:39.430 に答える
4

ここでは脱線しているかもしれませんが、LDAP 統合自体をテストしていない場合は、期待する値を常に返す Mock オブジェクトを使用して LDAP 接続をモックアウトし、他の単体テストを完了できるようにすることができます。

LDAP 接続をテストしている場合は、実際には統合テストを行っています。その場合、実際の LDAP 実装に接続するのがおそらく最善です。

于 2009-11-21T16:29:50.383 に答える
2

組み込みの LDAP 機能が Spring LDAP 自体によって提供されているのではなく、Apache Directory Serverによって提供されていることを知っている場合と知らない場合があります。残念ながら、Apache DS の LDIF ローダー (Spring によって配線されているように) は、エラー処理とレポート機能が非常に貧弱であるため、単体テストで実際に必要なように動作しない可能性があります。毎回白紙の状態から開始したい場合の最善の策は、Spring Security LDAP 単体テストを主導し、クリーンな LDIF ファイルのロードで毎回 Apache DS を再初期化することです。

または、LDIF を完全に避けて、単体テストを実行する前にデータの事前条件と事後条件を検証する独自の単体テスト ラッパーを作成することもできます。これはより多くの作業になりますが、最終的にはうまくいく可能性があります。

于 2009-12-05T05:36:44.867 に答える
1

私にとってはうまくいきます:

@Inject
private ApplicationContext applicationContext;

@Before
public void reloadLdapDirectory() throws NamingException, IOException{
    ApacheDSContainer apacheDSContainer = (ApacheDSContainer) applicationContext.getBean(BeanIds.EMBEDDED_APACHE_DS);
    LdapTestUtils.clearSubContexts(contextSource, DistinguishedName.EMPTY_PATH);

    ClassPathResource classPathResource = new ClassPathResource("ldap.ldif");

    File tempFile = File.createTempFile("spring_ldap_test", ".ldif");
    try {
        InputStream inputStream = classPathResource.getInputStream();
        IOUtils.copy(inputStream, new FileOutputStream(tempFile));
        LdifFileLoader fileLoader = new LdifFileLoader(apacheDSContainer.getService().getAdminSession(), tempFile.getAbsolutePath());
        fileLoader.execute();
    }
    finally {
        try {
            tempFile.delete();
        }
        catch (Exception e) {
            // Ignore this
        }
    }
}

私は似たようなことを尋ね、Luke Taylor から答えを得ました: spring-security と ldap を使用した統合テスト

于 2012-11-20T16:20:48.740 に答える