0

テスト用のデータを保持する cucumber jvm で機能ファイルを使用したいと考えています。

  • 処理前に休止状態を使用してオブジェクトをロードする方法をテストしています。

    public Deal getDealById(Long dealId) {
       deal = template.get(Deal.class, dealId);
       BigDecimal totalAmount = new BigDecimal();
       //loop through all of the loans related to this deal to add up a value
       for (Loan tempLoan: deal.loanList) {
           //add amount from each loan together
           BigDecimal totalAmount = totalAmount + tempLoan.amount;
       }
       //set the total amount value on the deal object
       deal.setTotalAmount(totalAmount);
       return deal;
    }
    

ロードするには dealId を指定する必要があるため、ロードについてはどうすればよいですか?

私の理解では、接続と、モックされた接続から生じるオブジェクトを「モック」する必要があるということです。

Jmock、mockito、dbunit をそれぞれ見ましたが、どうすればいいのかわかりません。

ご意見をいただければ幸いです。

メモを編集

さらにコードを追加しました。データベースからオブジェクトを取得しています。次に、取引に関連するオブジェクトのリスト (多対 1) をループし、各ローンの金額を取引金額に追加します。最後に、取引を返す前に取引の合計金額を設定します。

では、機能ファイルからテスト情報を提供したい場合、このメソッドの Junit テストを作成するにはどうすればよいでしょうか?

これが機能する「実際の」シナリオでは、取引をアプリケーションにロードし、各ローンのローン金額を追加して、それを取引に設定してから返します。しかし、このメソッド内でデータベースからロードする必要があることを考えると、このテスト用の JUnit を作成する方法がわかりません。

4

2 に答える 2

1

ロジックをDealクラスにリファクタリングすれば、データベースをモックする必要はまったくありません。さらに、それはより良いオブジェクト指向デザインです。

public Deal getDealById(Long dealId) {
   return template.get(Deal.class, dealId);
}

public class Deal {
   public BigDecimal recalculateTotalLoanAmount() {
      BigDecimal totalAmount = new BigDecimal();
      for (Loan tempLoan: deal.loanList)
         totalAmount = totalAmount + tempLoan.amount;
      setTotalAmount(totalAmount);
      return totalAmount;
   }
}
于 2012-08-07T19:22:15.337 に答える
0

コードをリファクタリングする必要があるというGarrettの回答に同意します。ただし、コメントの中で、リファクタリングは「私にとってはオプションではありません」と述べています。これを念頭に置いて、別の解決策は、データベースを模倣するのではなく、データベースを使用することです。

単体テストの一部として使用できる組み込みのインメモリデータベースがいくつかあります(HSQLDB、H2、Apache Derbyなど)。データベーススキーマをファイルで定義して、データベースがその場で作成されるようにします。また、データベーステーブルにテストデータをプリロードして、テストで作成する必要がないようにすることもできます。インメモリデータベースのロードは非常に高速です。

このタイプのセットアップをわずか数行のXMLで実行するための便利な構成を備えた、 SpringのようなフレームワークをJavaで使用することを強くお勧めします。ただし、コードをリファクタリングできないことを考えると、これはおそらくオプションではありません。

于 2012-08-09T15:12:46.730 に答える