Comment faire une vérification de l’instance avec Scala (Test)

J’essaie d’intégrer ScalaTest dans mon projet Java; remplacer tous les tests JUnit par ScalaTests. À un moment donné, je veux vérifier si l’injecteur de Guice injecte le type correct. 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 la même chose 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 l’ instanceof ne soit pas membre de Door / Window / Roof . Est-ce que je ne peux pas utiliser instanceof cette façon dans Scala?

Scala n’est pas Java. Scala n’a tout simplement pas l’opérateur instanceof mais une méthode paramésortingque appelée isInstanceOf[Type] .

Vous pourriez également aimer regarder un cours accéléré ScalaTest .

Avec Scalatest 2.2.x (peut-être même plus tôt), vous pouvez utiliser:

 anInstance mustBe a[SomeClass] 

Si vous voulez être moins JUnit-esque et si vous voulez utiliser les corrélateurs ScalaTest, vous pouvez écrire votre propre correcteur de propriété correspondant au type (effacement de type barre).

J’ai trouvé ce fil très utile: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea

Vous pouvez ensuite écrire des assertions comme:

 house.door should be (anInstanceOf[WoodenDoor]) 

au lieu de

 assert(house.door instanceof WoodenDoor) 

Les réponses actuelles concernant isInstanceOf [Type] et les conseils de junit sont bonnes mais je veux append une chose (pour les personnes qui ont accédé à cette page avec une capacité non liée à Junit). Dans de nombreux cas, la correspondance des schémas de scala sera adaptée à vos besoins. Je vous le recommande dans ces cas-là car cela vous donne la conversion gratuite et laisse moins de place à l’erreur.

Exemple:

 OuterType foo = blah foo match { case subFoo : SubType => { subFoo.thingSubTypeDoes // no need to cast, use match variable } case subFoo => { // fallthrough code } } 

Consolider la référence de discussion ScalaTest de Guillaume (et une autre discussion liée à celle de James Moore) en deux méthodes, mises à jour pour ScalaTest 2.x et Scala 2.10 (pour utiliser ClassTag plutôt que manifeste):

 import org.scalatest.matchers._ import scala.reflect._ def ofType[T:ClassTag] = BeMatcher { obj: Any => val cls = classTag[T].runtimeClass MatchResult( obj.getClass == cls, obj.toSsortingng + " was not an instance of " + cls.toSsortingng, obj.toSsortingng + " was an instance of " + cls.toSsortingng ) } def anInstanceOf[T:ClassTag] = BeMatcher { obj: Any => val cls = classTag[T].runtimeClass MatchResult( cls.isAssignableFrom(obj.getClass), obj.getClass.toSsortingng + " was not assignable from " + cls.toSsortingng, obj.getClass.toSsortingng + " was assignable from " + cls.toSsortingng ) } 

J’utilise 2.11.8 pour faire l’assertion avec des collections. La nouvelle syntaxe est la suivante:

 val scores: Map[Ssortingng, Int] = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) scores shouldBe a[Map[_, _]]