J'essaye d'incorporer ScalaTest dans mon projet Java; remplacer tous les tests JUnit par des ScalaTests. À un moment donné, je veux vérifier si l'injecteur de Guice injecte le bon type. En Java, j'ai un test comme celui-ci:
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);
}
}
Mais j'ai un problème à faire de même avec 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)
}
}
}
Il se plaint que la valeur instanceof
n'est pas membre de Door
/ Window
/ Roof
. Puis-je utiliser instanceof
cette méthode dans Scala?
isInstanceOf[TraitName]
.Avec Scalatest 2.2.x (peut-être même plus tôt), vous pouvez utiliser:
la source
a[Type]
pour que vous puissiez être grammaticalement correct;)tiger shouldBe a [Tiger]
est la syntaxe actuelle scalatest.org/at_a_glance/FlatSpecmustBe
est également correct, si vous utilisez doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers que vous voulez pour FreeSpec.Si vous voulez être moins JUnit-esque et si vous voulez utiliser les matchers de ScalaTest, vous pouvez écrire votre propre correspondance de propriété qui correspond au type (effacement du type de barre).
J'ai trouvé ce fil assez utile: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea
Vous pouvez ensuite écrire des assertions comme:
au lieu de
la source
Les réponses actuelles à propos de isInstanceOf [Type] et des conseils junit sont bonnes, mais je veux ajouter une chose (pour les personnes qui sont arrivées sur cette page dans une capacité non liée à junit). Dans de nombreux cas, la correspondance de motifs scala répondra à vos besoins. Je le recommanderais dans ces cas, car il vous donne le typage gratuitement et laisse moins de place à l'erreur.
Exemple:
la source
inside(foo)
place de `foo match). Voir scalatest.org/user_guide/using_matchers#matchingAPatternConsolidation de la référence de discussion ScalaTest de Guillaume (et d'une autre discussion liée à par James Moore) en deux méthodes, mises à jour pour ScalaTest 2.x et Scala 2.10 (pour utiliser ClassTag plutôt que manifest):
la source
J'utilise 2.11.8 pour faire l'assertion avec des collections. La nouvelle syntaxe est la suivante:
la source
Map
paramètres de type de. Ce que vous avez écrit équivaut à écrirescores shouldBe a[Map[_, _]]
. Ceci est mentionné ici: scalatest.org/user_guide/using_matchers#checkingAnObjectsClass