2

ScalaTest を使用して、テスト ケース内の関数の実装を置き換えたいと考えています。私のユースケース:

object Module {
  private def currentYear() = DateTime.now().year.get

  def doSomething(): Unit = {
    val year = currentYear()
    // do something with the year
  }
}

単体テスト testing を書きたいのですがModule.doSomething、このテスト ケースがテストが実行された実際の年に依存することは望ましくありません。

動的言語では、関数の実装を置き換えて固定値を返す構造体をよく使用しました。

Module.currentYear実際の年に関係なく、常に 2014 を返すようにテスト ケースの実装を変更したいと思います。

いくつかのモック ライブラリ (Mockito、ScalaMock など) を見つけましたが、それらはすべて新しいモック オブジェクトしか作成できませんでした。それらのどれもメソッドの実装を置き換えることができなかったようです.

それを行う方法はありますか?そうでない場合、テストが実行された年に依存せずに、どうすればそのようなコードをテストできますか?

4

2 に答える 2

1

ScalaMock はシングルトン オブジェクトをモックできます: http://paulbutcher.com/2011/11/06/scalamock-step-by-step/

トレイト (インターフェイス) と関数だけでなく、次のモックも作成できます。

クラス

シングルトンとコンパニオン オブジェクト (静的メソッド) ...

于 2014-08-03T09:32:13.773 に答える
1

1 つの方法はdo_something_with_the_year、テスト ケースにアクセスできるようにすることです (たとえば、パッケージを保護します)。依存関係の検索と実際の使用が分離されているため、これも優れています。

別の方法は、ロジックをトレイトに入れ、currentYearメソッドを保護し、オブジェクトをそのトレイトのインスタンスにすることです。そうすれば、テストでトレイトからカスタム オブジェクトを作成することができ、モック ライブラリは必要ありません。

于 2014-08-03T08:29:23.333 に答える