4

単体/統合テストを使用してJava Webアプリに取り組んでいます。アプリは Jetty にデプロイされ、maven の統合テスト フェーズの実行中に H2 db を使用します。H2 db に移行できない dao レイヤーから呼び出される Oracle 関数が 1 つあるため、テスト ケースの実行中にコードでこの部分をモック/スキップしたいと考えています。

アプリケーションをテストモードで実行しているかどうかを判断し、その条件をコードに入れることができるフラグを持つことを考えましたが、私にはよりクリーンなアプローチのようには見えません。これを達成するための最良のアプローチを提案してください。

4

3 に答える 3

3

Oracle ネイティブ呼び出しを別のクラス (おそらく DAO) に抽出します。そのDAOをそれを使用するクラスに注入します。Oracle を呼び出す代わりに何もせずに、その DAO の 2 番目の実装を作成します。統合テスト中に、後者の実装を挿入します。

コード内でフラグを使用しないでください。Spring を使用している場合は、いずれかの実装を選択的に作成するビルド プロファイルを使用します。

これが、依存性注入がコードのテストに役立つ方法です。システムの一部をモックしたい場合は、モックされたバージョンを注入するだけです。

于 2012-10-04T21:05:17.357 に答える
1

mockitojMockなどの優れたモックフレームワークまたは他の同様のモックフレームワークを使用してください。

注意:コードをテストしやすくするために、コードをリファクタリングする必要がある場合があります。

于 2012-10-04T21:07:04.923 に答える
1

質問が本当にある場合:

Javaでユニットテストするときにコードのセクションをスキップするにはどうすればよいですか?

それから私は与えられた答えに同意します。依存性注入、モックフレームワークは、真の単体テストを実行するための絶対的に正しい方法です。

ただし、質問が次の場合:

JUnit(または他の単体テストフレームワーク)を使用するときにコードのセクションをスキップするにはどうすればよいですか?

それなら答えは「状況次第」だと思います。統合テストにJUnitを使用することがあります。これは、テストサーバーに対して実行するクライアントコードのスニペットであり、GUIを介してこれらのクライアント側テストを手動で実行する手間を省きます。この場合、たとえば基本クラスでシステムプロパティを使用します。

protected boolean skipTest()
{
    String port = System.getProperty("jersey.test.port");
    // don't run this test unless developer has explicitly set the testing properties
    // this is an integration test, not a unit test
    return port == null;
}

次に、実際のテストクラスでは次のようになります。

// verify a successful login
@Test
public void testLogin()
{
    if (skipTest())
       return;

    // do real test

したがって、私の考えでは、DAOからOracleのものをリファクタリングできない場合は、実際に統合テストを実行しており、単体テストにskipTestを含めても問題ありません。

于 2012-10-04T21:27:59.057 に答える