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
'source' 카테고리의 다른 글
PHPMyAdmin 언어 설정 (0) | 2022.12.24 |
---|---|
문자열에서 문자열 오카렌스를 계산하는 방법 (0) | 2022.12.24 |
최대 업로드 파일 크기 변경 (0) | 2022.12.04 |
MariaDB Galera 클러스터 서버는 100% CPU로 동작하며 부하가 상승합니다. (0) | 2022.12.04 |
부울 또는 TINYINT 혼동 (0) | 2022.12.04 |