Ich versuche, ScalaTest in mein Java-Projekt zu integrieren. Ersetzen aller JUnit-Tests durch ScalaTests. An einer Stelle möchte ich überprüfen, ob Guices Injector den richtigen Typ injiziert. In Java habe ich einen Test wie diesen:
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);
}
}
Aber ich habe ein Problem damit, dasselbe mit ScalaTest zu tun:
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)
}
}
}
Es wird beanstandet, dass der Wert instanceof
kein Mitglied von Door
/ Window
/ ist Roof
. Kann ich instanceof
das in Scala nicht so verwenden ?
isInstanceOf[TraitName]
.Mit Scalatest 2.2.x (möglicherweise sogar früher) können Sie Folgendes verwenden:
quelle
a[Type]
damit Sie grammatikalisch korrekt sein können;)tiger shouldBe a [Tiger]
ist die aktuelle Syntax scalatest.org/at_a_glance/FlatSpecmustBe
ist auch korrekt, wenn Sie doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers verwenden, die Sie für FreeSpec möchten.Wenn Sie weniger JUnit-artig sein möchten und die ScalaTest-Matcher verwenden möchten, können Sie Ihren eigenen Eigenschafts-Matcher schreiben, der dem Typ entspricht (Löschen des Balkentyps).
Ich fand diesen Thread sehr nützlich: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea
Sie können dann Aussagen schreiben wie:
anstatt
quelle
Die aktuellen Antworten zu isInstanceOf [Type] und Junit-Ratschlägen sind gut, aber ich möchte eine Sache hinzufügen (für Personen, die diese Seite in einer nicht junit-bezogenen Funktion aufgerufen haben). In vielen Fällen entspricht der Scala-Mustervergleich Ihren Anforderungen. Ich würde es in diesen Fällen empfehlen, da es Ihnen die kostenlose Typisierung ermöglicht und weniger Raum für Fehler lässt.
Beispiel:
quelle
inside(foo)
anstelle von "foo match". Siehe scalatest.org/user_guide/using_matchers#matchingAPatternKonsolidierung von Guillaumes ScalaTest-Diskussionsreferenz (und einer weiteren von James Moore verknüpften Diskussion) in zwei Methoden, die für ScalaTest 2.x und Scala 2.10 aktualisiert wurden (um ClassTag anstelle von Manifest zu verwenden):
quelle
Ich benutze 2.11.8, um die Behauptung mit Sammlungen zu machen. Die neuere Syntax lautet wie folgt:
quelle
Map
Typparameter des Typs nicht überprüfen . Was Sie geschrieben haben, ist dasselbe wie Schreibenscores shouldBe a[Map[_, _]]
. Dies wird hier erwähnt: scalatest.org/user_guide/using_matchers#checkingAnObjectsClass