Я пытаюсь включить ScalaTest в свой Java-проект; замена всех тестов JUnit на ScalaTests. В какой-то момент я хочу проверить, вводит ли Guice Injector правильный тип. В Java у меня есть такой тест:
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);
}
}
Но у меня проблема с тем, чтобы сделать то же самое со 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)
}
}
}
Он жалуется, что значение instanceof
не является членом Door
/ Window
/ Roof
. Разве я не могу использовать instanceof
это в Scala?
isInstanceOf[TraitName]
.В Scalatest 2.2.x (возможно, даже раньше) вы можете использовать:
источник
a[Type]
так что вы можете быть грамматически правильными;)tiger shouldBe a [Tiger]
это текущий синтаксис scalatest.org/at_a_glance/FlatSpecmustBe
также верен, если вы используете doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers, который вам нужен для FreeSpec.Если вы хотите быть менее JUnit-esque и если вы хотите использовать сопоставители ScalaTest, вы можете написать свой собственный сопоставитель свойств, который соответствует типу (стирание типа полосы).
Я нашел этот поток весьма полезным: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea
Затем вы можете написать такие утверждения, как:
вместо того
источник
Текущие ответы об isInstanceOf [Type] и советах по junit хороши, но я хочу добавить одну вещь (для людей, которые попали на эту страницу в качестве, не связанном с junit). Во многих случаях сопоставление с шаблоном scala подойдет вам. Я бы порекомендовал его в таких случаях, потому что он дает вам бесплатное приведение типов и оставляет меньше места для ошибок.
Пример:
источник
inside(foo)
вместо `foo match). См. Scalatest.org/user_guide/using_matchers#matchingAPatternОбъединение ссылки на обсуждение ScalaTest Гийома (и другого обсуждения, связанного с Джеймсом Муром) в два метода, обновленных для ScalaTest 2.x и Scala 2.10 (для использования ClassTag, а не manifest):
источник
Я использую 2.11.8 для утверждения с коллекциями. Новый синтаксис выглядит следующим образом:
источник
Map
параметры типа. Вы написали то же самое, что написалиscores shouldBe a[Map[_, _]]
. Это упомянуто здесь: scalatest.org/user_guide/using_matchers#checkingAnObjectsClass