Estou tentando incorporar ScalaTest em meu projeto Java; substituindo todos os testes JUnit por ScalaTests. A certa altura, quero verificar se o injetor de Guice injeta o tipo correto. Em Java, tenho um teste como este:
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);
}
}
Mas tenho um problema para fazer o mesmo com o 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)
}
}
}
Ele reclama que o valor instanceof
não é membro de Door
/ Window
/ Roof
. Não posso usar instanceof
assim no Scala?
isInstanceOf[TraitName]
.Com o Scalatest 2.2.x (talvez até anterior), você pode usar:
fonte
a[Type]
para que você possa estar gramaticalmente correto;)tiger shouldBe a [Tiger]
é a sintaxe atual scalatest.org/at_a_glance/FlatSpecmustBe
também está correto, se você usar doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers que deseja para o FreeSpec.Se você quiser ser menos JUnit-esque e se quiser usar os matchers do ScalaTest, você pode escrever seu próprio matcher de propriedade que corresponda ao tipo (apagamento do tipo de barra).
Achei este tópico muito útil: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea
Você pode escrever afirmações como:
ao invés de
fonte
As respostas atuais sobre isInstanceOf [Type] e conselhos junit são boas, mas quero acrescentar uma coisa (para as pessoas que acessaram esta página por motivos não relacionados a junit). Em muitos casos, a correspondência de padrões do scala atenderá às suas necessidades. Eu recomendaria nesses casos porque dá a você o typecasting de graça e deixa menos espaço para erros.
Exemplo:
fonte
inside(foo)
vez de `correspondência foo). Consulte scalatest.org/user_guide/using_matchers#matchingAPatternConsolidando a referência de discussão ScalaTest de Guillaume (e outra discussão vinculada a James Moore) em dois métodos, atualizados para ScalaTest 2.xe Scala 2.10 (para usar ClassTag em vez de manifesto):
fonte
Eu uso 2.11.8 para fazer a declaração com coleções. A sintaxe mais recente é a seguinte:
fonte
Map
parâmetros de tipo de. O que você escreveu é o mesmo que escreverscores shouldBe a[Map[_, _]]
. Isso é mencionado aqui: scalatest.org/user_guide/using_matchers#checkingAnObjectsClass