47

データベースに接続し、1 つ以上のクエリを実行し、結果を処理するコードの単体テストを書きたいと思います。(実際にデータベースを使用せずに)

ここにいる別の開発者は、xml 構成ファイルに基づいて対応するオブジェクトを返す独自の DataSource、Connection、Statement、PreparedStatement、および ResultSet 実装を作成しました。(偽のデータソースを使用して、それが返す結果セットに対してテストを実行するだけで済みます)。

ここで車輪を再発明していますか?このようなものは単体テスト用にすでに存在しますか? jdbcコードをテストするための他の/より良い方法はありますか?

4

12 に答える 12

33

いくつかのオプションがあります:

  • JMockなどのモック ライブラリを使用してデータベースをモックします。これの大きな欠点は、クエリとデータがまったくテストされない可能性が高いことです。
  • HSQLDBなどの軽量データベースをテストに使用します。クエリが単純な場合、これがおそらく最も簡単な方法です。
  • テスト専用のデータベースを用意します。DBUnitは適切なオプションですが、Maven を使用している場合は、sql-maven-pluginを使用してデータベースを適切にセットアップおよび破棄することもできます (テスト間の依存関係に注意してください)。このオプションをお勧めします。クエリがデータベース ベンダーで適切に機能するという最大の自信が得られるからです。

データベースが使用可能な場合にのみこれらのテストが実行されるように、これらのテストを構成可能にすることが必要であり、有用な場合があります。これは、ビルド プロパティなどで行うことができます。

于 2009-04-22T09:20:59.587 に答える
25

たとえば、CSV ファイルから初期データを読み取ることができるHSQLDBと一緒にDBUnitを使用できます。

于 2008-11-05T19:56:03.693 に答える
8

次の組み合わせを使用するのが好きです。

DBUnit と HSQLDB だけでかなりのことができます。Unitils は、データベースの状態を管理およびリセットするためのコードのラストマイルを提供します。また、データベース スキーマの変更を管理する優れた方法を提供し、特定の RBDMS (Oracle、DB2、SQL Server など) を簡単に使用できるようにします。最後に、Unitils は、API を最新化し、DBUnit の操作をより快適にする DBUnit の優れたラッパーを提供します。

Unitils をまだチェックアウトしていない場合は、ぜひチェックしてください。Unitils はしばしば見落とされ、過小評価されています。

于 2012-01-03T20:16:26.433 に答える
4

そのため、derby (現在は JavaDB と呼ばれています) またはsqliteを使用しています。これらは、比較的迅速かつ簡単に作成、ロード、テスト、および破棄できる小さくて単純なデータベースです。

于 2008-11-05T19:59:20.363 に答える
2

統合テストではなく単体テストを実行する場合は、次のように、Mockito のみを使用して、非常に基本的でシンプルなアプローチを使用できます。

public class JDBCLowLevelTest {

    private TestedClass tested;
    private Connection connection;
    private static Driver driver;

    @BeforeClass
    public static void setUpClass() throws Exception {
        // (Optional) Print DriverManager logs to system out
        DriverManager.setLogWriter(new PrintWriter((System.out)));

        // (Optional) Sometimes you need to get rid of a driver (e.g JDBC-ODBC Bridge)
        Driver configuredDriver = DriverManager.getDriver("jdbc:odbc:url");

        System.out.println("De-registering the configured driver: " + configuredDriver);
        DriverManager.deregisterDriver(configuredDriver);

        // Register the mocked driver
        driver = mock(Driver.class);
        System.out.println("Registering the mock driver: " + driver);
        DriverManager.registerDriver(driver);
    }

    @AfterClass
    public static void tearDown() throws Exception {
        // Let's cleanup the global state
        System.out.println("De-registering the mock driver: " + driver);
        DriverManager.deregisterDriver(driver);
    }

    @Before
    public void setUp() throws Exception {
        // given
        tested = new TestedClass();

        connection = mock(Connection.class);

        given(driver.acceptsURL(anyString())).willReturn(true);
        given(driver.connect(anyString(), Matchers.<Properties>any()))
                .willReturn(connection);

        given(connection.prepareCall(anyString())).willReturn(statement);        
    }
}

他の Mockito テストと同様に、さまざまなシナリオをテストできます。

@Test
public void shouldHandleDoubleException() throws Exception {
    // given
    SomeData someData = new SomeData();

    given(connection.prepareCall(anyString()))
            .willThrow(new SQLException("Prepare call"));
    willThrow(new SQLException("Close exception")).given(connection).close();

    // when
    SomeResponse response = testClass.someMethod(someData);

    // then
    assertThat(response, is(SOME_ERROR));
}
于 2014-01-03T10:22:42.003 に答える
2

テストが簡単ではないコードのテストには、EasyMockを使用することを好みます。

于 2009-12-01T13:06:25.560 に答える
2

単体テストでは HSQL を使用するとよいでしょう。テストのポイントは、jdbc コードをテストし、それが機能することを確認することです。カスタム クラスを追加したり、jdbc 呼び出しをモックしたりすると、バグを簡単に隠すことができます。

私は主に mysql を使用し、テストでドライバー クラスを実行すると、URL が org.hsqldb.jdbcDriver および jdbc:hsqldb:mem:test に変更されます。

于 2008-11-07T08:17:49.983 に答える
1

もちろん、アプリケーションで jdbc をモックする方法は、実際の jdbc トランザクションをどのように実装したかによって異なります。

jdbc をそのまま使用している場合は、次の行でいくつかのタスクを実行するためのユーティリティ クラスを自分で作成したと思いますDBUtils.getMetadataFor(String tablename)。これが意味することは、そのクラスのモックを作成する必要があり、それだけで十分な場合があるということです。すでに一連の jdbc 関連のモック オブジェクトが利用可能であるように見えるので、これはかなり簡単な解決策です。あなたのjdbcコードがアプリケーション全体に展開されていないと仮定していることに注意してください-もしそうなら、リファクタリング!!!

ただし、データベース処理用のフレームワーク (Spring Framework の JDBC Template クラスなど) を使用している場合は、EasyMock またはその他の同等のものを使用してインターフェイス クラスをモックできますし、モックする必要があります。そうすれば、接続を簡単にモックするために必要な世界のすべての力を手に入れることができます。

最後に、他に何も機能しない場合は、他の人がすでに言ったことを実行して、DBUnit や derby を使用できます。

于 2008-11-08T14:09:08.463 に答える
1

DBUnitがあります。データベースなしで jdbc コードをテストすることはできませんが、データベースをエミュレートすることで別の購入セットを導入できるようです。

于 2008-11-05T19:51:20.317 に答える
0

Mockrunnerを使用します。http://mockrunner.sourceforge.net/ モック接続とデータソースが組み込まれているため、自分で実装する必要はありません。

于 2011-09-14T15:40:50.893 に答える
0

Acolyte ドライバーを使用して JDBC 接続をモックアップし、テスト中にそれを管理し、データを結果セットとして返します (タイプセーフな行リスト API を使用): https://github.com/cchantep/acolyte

注: 私は Acolyte の作成者です。

于 2013-12-31T08:47:03.617 に答える