4

私のクラスでは、2 つのバージョンのメソッドがあります。1 つは 、もう 1 つはExceptionですString

class Foo {
  def method(e: Exception) = ???
  def method(s: String) = ???
}

ではJMock、型に基づいてメソッドの呼び出しをモックできます。Exceptionテストで何を期待しているかを明確にするために、サブタイプ を使用していることに注意してください。

context.checking(new Expectations() {{              
    oneOf(mock).method(with(any(SubTypedException.class)));
}}

ではScalamock、ワイルドカードを使用して一致させることができます

(mock.method(_: Exception)).expects(*).once

以下は、特定のサブタイプで照合しようとするとコンパイルされません (これは Scala では意味がないことに気付きました)。

// doesn't compile    
(mock.method(_: SubTypedException)).expects(*).once

with(any(SubTypesException.class))を に変換するにはどうすればよいJMockですScalamockか? 述語一致 ( ) を使用することは想像できますが、それでよいwhereでしょうか?

編集:考えてみると、JMockwith(any(SubTypedException))はコンパイラを満足させ、意図を表現することを目的としています。私が理解しているように、これMatcherIsAnythingマッチャーであるため、別のタイプの例外がスローされた場合、実際にはテストに失敗しません。

そのため、適切な状況下でインテントを取得し、テストに失敗することの両方を Scalamock に要求している可能性があります。instanceOfScalamockのようなことを行う方法を説明する際のボーナス ポイント。

4

1 に答える 1

1

まず第一に: 型の割り当ては (静的な) オーバーロードの解決を支援するためだけのものであるため、以下はコンパイルされません。この行には、Scalamock に固有のものは何もありません。

(mock.method(_: SubTypedException))

ヘルパー関数と一緒ArgThatに ScalaMock で導入された、使用できる引数の実行時の型をテストするには:3.2.1

import scala.reflect.ClassTag

def typedArg[T, U : ClassTag]: ArgThat[T] = new ArgThat[T]({
  case x: U => true
  case _ => false
})

(mock.method(_: Exception)).expects(typedArg[Exception, SubTypedException])
于 2015-05-11T20:31:12.670 に答える