2

jUnit で DAO クラスをテストするためのベスト プラクティスを探しています。私の DAO クラスには、createUser(User user)、deleteUser(Long id)、updateUser(User user)、findUserById(Long id) などの典型的な DAO メソッドがいくつかあります。

したがって、createUser は簡単です。ユーザーを作成し、後で ID があるかどうかを確認できます。はいの場合、テストはパスします。または、ユーザーを作成し、後でDBからユーザーを読み取り、1)ユーザーが見つかるかどうかを確認します2)返されたユーザーのインスタンス変数が、以前に保存されたユーザーと同じかどうかを確認します

では、deleteUser 関数はどうでしょうか。ID が必要ですが、ID を取得するには、まずユーザーを作成する必要があります。では、これを行う方法は?test メソッドの testCreateUser メソッドを使用するか、DAO クラスの createUser メソッドを使用しますか?

最初に User を更新する必要がある updateUser(User user) と、最初に Id が必要な findUserById(Long id) の場合も同じです。

私の要件はかなり一般的だと思うので、jUnit で DAO をテストするための設計パターンのようなものがあるかどうか疑問に思っています。

ありがとう、ポール

4

4 に答える 4

2

私見では、JUnit テストを行うためのそのような設計パターンはありません。参照する必要があるベスト プラクティスがあります。

たとえば、以下の場合、ユーザーを削除する前に testCreateUser メソッドを使用してユーザーを作成しません。そのためにはDAOクラスを使用する必要があります。各テスト ケース メソッドは互いに独立しています。

では、deleteUser 関数はどうでしょうか。ID が必要ですが、ID を取得するには、まずユーザーを作成する必要があります。では、これを行う方法は?test メソッドの testCreateUser メソッドを使用するか、DAO クラスの createUser メソッドを使用しますか?

さて、あなたの問題を解決するために、setUpとtearDownメソッドを使用できます。setUp メソッドでは、テストしたいモック オブジェクトを作成でき、tearDown メソッドではそれらを削除できます。そうする場合、各テストメソッドは、テストできるモック データの同じセットを取得します。

于 2012-10-09T14:42:12.690 に答える
1

すべてのテストの前にテストデータで満たされ、テストの実行が終了すると破棄されるインメモリデータベースを使用できます。ダービーを見てください

考慮すべきもう1つのことは、DAOレイヤーを実際に単体テストする必要があるかどうかです。Daoには、定義上、ビジネスロジックが含まれていてはならず、永続フレームワークをテストすることになります。

于 2012-10-09T20:39:43.247 に答える
1

IMOは、単体テストを単独で実行できる必要があります。

したがって、たとえば、削除テストでは、最初にユーザーを作成してから削除し、(ロードを試みて)ユーザーがもう存在しないことを確認します。

前のテストが何らかの理由で失敗した場合、次のテストも失敗するため、前のテストに依存することは良い方法ではありません。

于 2012-10-09T14:37:02.193 に答える
1

私の通常のアプローチは、同じテスト内で DAO の他のメソッドを使用することです。例えば

user = UserStore.create(...);
id = user.id();
loadedUser = UserStore.load(id);
assertThat(loadedUser, eq(user));

このアプローチを採用する場合、単体テストの「単体」はクラス全体ですが、通常は一度に関数を単体テストします。これは受け入れられ、十分にテストされたクラスになります。このアプローチの問題は、UserStore.create または UserStore.load のエラーが原因でテストが失敗する可能性があることですが、小さなクラスではデバッグが難しくなく、非常にうまく機能する傾向があることがわかりました。テスト後にデータベースを手動でチェックするという他のアプローチも試しましたが、余分な作業は通常、それだけの価値がないことがわかりました。

Rails などの一部のフレームワークは、異なるアプローチを採用しています。テストを実行する前に、データベースにデータをシードする方法を提供します。フレームワークによって簡単になるため、これはうまく機能します。より多くのツールがこのアプローチをサポートするようになるにつれて、これが標準になるかもしれません。

于 2012-10-09T14:28:24.900 に答える