1

データベースに対して操作を実行するためにいくつかのDAOクラスを呼び出すビジネスメソッドのテストを書いています。

このメソッドは、最初にDataSourceオブジェクトからJDBC接続を取得します。同じ接続がすべてのDAOインスタンスに渡されるため、これを使用してトランザクションを制御できます。したがって、すべてが正しく機能する場合は、接続オブジェクトに対してcommit()を呼び出す必要があります。

commit()が呼び出されるかどうかをテストしたいので、それをチェックする期待値(JMockを使用しています)を作成することを考えました。しかし、Connectionクラスは私のBusinessクラスの直接の隣人ではないので、これを行う方法がわかりません。

誰かがこれを克服する方法を知っていますか?このためのいくつかのJMock機能、またはこれを克服することを可能にするいくつかの代替設計がありますか?

ありがとう

4

6 に答える 6

3

DataSource あなたのモックがあなたの mockを 返すConnectionように、あなたはモックする必要があります。そうそう、こういうのって結局すごく苦しくて……。DataSourceConnection

于 2008-10-24T13:17:33.627 に答える
3

クラスがどのように構成されているかをあなたの説明から正確に伝えるのは難しいですが、コンストラクターまたはsetDataSource()メソッドのいずれかを介して、DataSource を DAO クラスに注入する必要があります。

これにより、DAO を分離してテストし、単体テストでモック DataSource を構築して、テスト対象の DAO に渡すことができます。

于 2008-10-24T13:18:38.493 に答える
1

Connection が Dao に注入され、Dao がビジネス クラスに注入されるようにリファクタリングします。その後、Dao および/または接続をモックできます。Connection を拡張し、connect() をオーバーライドして boolean を設定する独自のモックを簡単に作成できます。ブール値は、後で wasConnectCalled() などの書き込みメソッドを介して取得します。

于 2008-10-24T13:48:28.340 に答える
1

この種のコードを自分で記述しようとするのではなく、spring-jdbcを使用することを強くお勧めします。これにより、接続、ステートメント、および結果セットが正しく閉じられます。また、Spring には優れたトランザクション管理機能があるため、これについて心配する必要はありません。

たとえば、spring-jdbc を使用したこの典型的な更新ステートメントを見てください。

public void updateName(int id, String name) {
    getJdbcTemplate().update(
            "update mytable set name = ? where id = ?", 
            new Object[] {name, new Integer(id)});
}
于 2009-01-28T19:52:37.950 に答える
0

bussines クラスがグローバル/静的オブジェクト ファクトリからローカル変数を取得するようにします。そうすれば、ファクトリをテスト モードにして、実際のオブジェクトではなくモック オブジェクトを返すようにすることができます。

それでうまくいくはずです。

于 2008-10-24T13:21:26.660 に答える
0

@ポール出向。接続の管理を分離したら、残りの動作をコールバックに記述して、接続を所有するもの (UnitOfWork など) に渡すことができます。接続所有者は、トランザクションを処理し、接続を UnitOfWork に渡します。ある場所でのトランザクション -- 簡単にテストでき、別の場所で UnitOfWork を模擬接続でテストします。

于 2009-05-21T18:22:58.277 に答える