Próbuję włączyć ScalaTest do mojego projektu Java; zamiana wszystkich testów JUnit na ScalaTests. W pewnym momencie chcę sprawdzić, czy wtryskiwacz Guice'a wstrzykuje właściwy typ. W Javie mam taki test:
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);
}
}
Ale mam problem z zrobieniem tego samego ze 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)
}
}
}
Narzeka, że wartość instanceof
nie jest członkiem Door
/ Window
/ Roof
. Nie mogę instanceof
tego używać w Scali?
isInstanceOf[TraitName]
.Dzięki Scalatest 2.2.x (może nawet wcześniej) możesz użyć:
źródło
a[Type]
więc możesz być poprawny gramatycznie;)tiger shouldBe a [Tiger]
to aktualna składnia scalatest.org/at_a_glance/FlatSpecmustBe
jest również poprawne, jeśli używasz doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers, które chcesz dla FreeSpec.Jeśli chcesz być mniej JUnit-esque i jeśli chcesz używać dopasowań ScalaTest, możesz napisać własny element dopasowujący właściwość, który będzie pasował do typu (wymazywanie typu słupka).
Uważam, że ten wątek jest całkiem przydatny: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea
Możesz następnie pisać asercje, takie jak:
zamiast
źródło
Aktualne odpowiedzi na temat isInstanceOf [Type] i porady dotyczące junit są dobre, ale chcę dodać jedną rzecz (dla osób, które trafiły na tę stronę w charakterze niezwiązanym z junit). W wielu przypadkach dopasowanie wzorca scala będzie odpowiadało Twoim potrzebom. Poleciłbym to w takich przypadkach, ponieważ daje ci to rzutowanie za darmo i pozostawia mniej miejsca na błędy.
Przykład:
źródło
inside(foo)
zamiast `foo match). Zobacz scalatest.org/user_guide/using_matchers#matchingAPatternSkonsolidowanie odniesienia do dyskusji Guillaume's ScalaTest (i innej dyskusji, do której prowadzi James Moore) w dwie metody, zaktualizowane do ScalaTest 2.x i Scala 2.10 (aby używać ClassTag zamiast manifestu):
źródło
Używam 2.11.8, aby wykonać asercję ze zbiorami. Nowsza składnia jest następująca:
źródło
Map
parametrów typu. To, co napisałeś, jest tym samym, co pisaniescores shouldBe a[Map[_, _]]
. Jest o tym mowa tutaj: scalatest.org/user_guide/using_matchers#checkingAnObjectsClass