[java] Scala (Test)로 instanceof 검사를 수행하는 방법

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)
        }
    }
}

instanceofDoor/ Window/ 의 구성원이 아니라고 불평합니다 Roof. instanceofScala에서 그런 식으로 사용할 수 없습니까 ?



답변

Scala는 Java가 아닙니다. Scala에는 연산자가없는 instanceof대신라는 매개 변수 메서드가 isInstanceOf[Type]있습니다.

ScalaTest Crash Course를 시청할 수도 있습니다 .


답변

Scalatest 2.2.x (아마도 이전 버전 일 수도 있음)에서는 다음을 사용할 수 있습니다.

anInstance mustBe a[SomeClass]


답변

JUnit-esque를 줄이고 싶고 ScalaTest의 매처를 사용하려면 유형 (막대 유형 삭제)과 일치하는 고유 한 속성 매처를 작성할 수 있습니다.

이 스레드가 매우 유용하다는 것을 알았습니다. http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea

그런 다음 다음과 같은 어설 션을 작성할 수 있습니다.

house.door should be (anInstanceOf[WoodenDoor])

대신에

assert(house.door instanceof WoodenDoor)


답변

isInstanceOf [Type] 및 junit 조언에 대한 현재 답변은 좋지만 한 가지 추가하고 싶습니다 (이 페이지에 비 Junit 관련 용량으로 도착한 사람들을 위해). 대부분의 경우 스칼라 패턴 일치는 사용자의 요구에 적합합니다. 이 경우 무료로 형변환을 제공하고 오류의 여지가 적기 때문에 이러한 경우에 권장합니다.

예:

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


답변

Guillaume의 ScalaTest 토론 참조 (및 James Moore가 연결 한 또 다른 토론)를 ScalaTest 2.x 및 Scala 2.10 (매니페스트 대신 ClassTag 사용)에 대해 업데이트 된 두 가지 방법으로 통합 :

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
  )
}


답변

2.11.8을 사용하여 컬렉션에 대한 주장을 수행합니다. 최신 구문은 다음과 같습니다.

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


답변