121 votes

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

J'essaie d'intégrer ScalaTest dans mon projet Java, en remplaçant 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 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'instance de valeur n'est pas un membre de Door / Window / Roof. Puis-je utiliser instanceof de cette façon dans Scala?

130voto

martin-g Points 2736

Avec Scalatest 2.2.x (peut-être même plus tôt), vous pouvez utiliser: anInstance mustBe an[SomeClass]

124voto

agilesteel Points 8330

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

30voto

Guillaume Belrose Points 723

Si vous voulez être moins JUnit-esque et si vous souhaitez utiliser ScalaTest de rapprochement, vous pouvez écrire votre propre propriété matcher qui correspond pour type (type de barre d'effacement).

J'ai trouvé ce thread pour être tout à fait 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)

18voto

alexbobp Points 31

Les réponses actuelles concernant isInstanceOf [Type] et les conseils Junit sont bonnes, mais je souhaite ajouter une chose (pour les personnes ayant consulté cette page sans aucune relation avec Junit). Dans de nombreux cas, la correspondance des motifs scala répondra à vos besoins. Je le recommanderais dans ces cas-là, car cela vous donne la transtypage 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
  }
}
 

3voto

Raman Points 1250

Consolidation de la référence de discussion ScalaTest de Guillaume (et 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 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.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
  )
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X