source

Scala(테스트)를 사용하여 인스턴스 오브 체크를 수행하는 방법

nicesource 2022. 12. 4. 22:33
반응형

Scala(테스트)를 사용하여 인스턴스 오브 체크를 수행하는 방법

Java 프로젝트에 ScalaTest를 도입하려고 합니다.모든 JUnit 테스트를 ScalaTest로 대체하려고 합니다.Guice의 Injector가 올바른 타입을 주입하는지 확인하고 싶습니다.자바에서는 다음과 같은 테스트가 있습니다.

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는 Java가 아닙니다.스칼라에는 연산자가 없습니다.instanceof대신, 그것은 라고 불리는 파라메트릭 방법을 가지고 있다.isInstanceOf[Type].

ScalaTest 크래시 코스도 즐기실 수 있습니다.

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

anInstance mustBe a[SomeClass]

JUnit-esque를 줄이고 ScalaTest의 매처를 사용하려면 유형에 맞는 속성 매처를 직접 작성할 수 있습니다(막대 유형 삭제).

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

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

house.door should be (anInstanceOf[WoodenDoor])

대신

assert(house.door instanceof WoodenDoor)

현재 is Instance Of [ 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[_, _]] 

언급URL : https://stackoverflow.com/questions/8561898/how-to-do-an-instanceof-check-with-scalatest

반응형