ScalaTestをJavaプロジェクト;すべてのJUnitテストをScalaTestsに置き換えます。ある時点で、Guiceのインジェクターが正しい型を注入するかどうかを確認したいと思います。Javaでは、このようなテスト:
public class InjectorBehaviour {
@Test
public void shouldInjectCorrectTypes() {
Injector injector = Guice.createInjector(new ModuleImpl());
House house = injector.getInstance(House.class);
assertTrue(house.door() instanceof WoodenDoor);
assertTrue(house.window() instanceof BambooWindow);
assertTrue(house.roof() instanceof SlateRoof);
}
}
しかし、私はScalaTestで同じことをするのに問題があります:
class InjectorSpec extends Spec {
describe("An injector") {
it("should inject the correct types") {
val injector = Guice.createInjector(new ModuleImpl)
val house = injector.getInstance(classOf[House])
assert(house.door instanceof WoodenDoor)
assert(house.window instanceof BambooWindow)
assert(house.roof instanceof SlateRoof)
}
}
}
値instanceof
がDoor
/Window
/Roof
のメンバーではないと文句を言います。 Scalaでinstanceof
をそのまま使用することはできませんか?
ScalaはJavaではありません。 Scalaには演算子instanceof
がなく、代わりにisInstanceOf[Type]
と呼ばれるパラメトリックメソッドがあります。
ScalaTestクラッシュコース もお楽しみください。
Scalatest 2.2.x(以前の場合もあります)では、次を使用できます。
anInstance mustBe a[SomeClass]
JUnit風にならないようにしたい場合、およびScalaTestのマッチャーを使用したい場合は、タイプ(バータイプ消去)に一致する独自のプロパティマッチャーを記述できます。
このスレッドは非常に有用であることがわかりました: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea
その後、次のようなアサーションを記述できます。
house.door should be (anInstanceOf[WoodenDoor])
の代わりに
assert(house.door instanceof WoodenDoor)
IsInstanceOf [Type]とjunitアドバイスに関する現在の答えは良いですが、1つだけ追加したいと思います(このページにアクセスしたのは、非ジュニティ関連の能力です)。多くの場合、scalaパターンマッチングはあなたのニーズに適合します。タイプキャストを無料で提供し、エラーの余地を少なくするため、これらの場合に推奨します。
例:
OuterType foo = blah
foo match {
case subFoo : SubType => {
subFoo.thingSubTypeDoes // no need to cast, use match variable
}
case subFoo => {
// fallthrough code
}
}
GuillaumeのScalaTestディスカッションリファレンス(およびJames Mooreにリンクされている別のディスカッション)を2つのメソッドに統合し、ScalaTest 2.xおよびScala 2.10(マニフェストではなくClassTagを使用)用に更新):
import org.scalatest.matchers._
import scala.reflect._
def ofType[T:ClassTag] = BeMatcher { obj: Any =>
val cls = classTag[T].runtimeClass
MatchResult(
obj.getClass == cls,
obj.toString + " was not an instance of " + cls.toString,
obj.toString + " was an instance of " + cls.toString
)
}
def anInstanceOf[T:ClassTag] = BeMatcher { obj: Any =>
val cls = classTag[T].runtimeClass
MatchResult(
cls.isAssignableFrom(obj.getClass),
obj.getClass.toString + " was not assignable from " + cls.toString,
obj.getClass.toString + " was assignable from " + cls.toString
)
}
2.11.8を使用して、コレクションでアサーションを実行します。新しい構文は次のとおりです。
val scores: Map[String, Int] = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
scores shouldBe a[Map[_, _]]