斯卡拉预计异常片段
问题描述:
我试图模拟常见测试框架(例如JUnit或TestNG)的预期异常行为。斯卡拉预计异常片段
这是我能想出这么远(工作):
trait ExpectAsserts
{
self : {
def fail (message : String)
def success (message : String)
} =>
def expect[T](exceptionClass : Class[T])(test : => Unit)
{
try
{
test
fail("exception not thrown")
}
catch
{
case expected : T => success("got exception " + expected)
case other : Exception => fail("expected "+ exceptionClass + " but " + other + " thrown instead.")
}
}
}
object Main extends ExpectAsserts
{
def main (args : Array[String])
{
expect(classOf[ArithmeticException])
{
throw new IllegalArgumentException // this should print an error message.
}
}
def fail (s : String)
{
System.err.println(s)
}
def success(s : String)
{
System.out.println(s)
}
}
代码段有一个main
方法分析代码。我的问题是,抛出的异常的第一图案匹配的语句进入:
case expected : T
虽然我实际上说的异常必须是T
型,这将是IllegalArgumentException
的。
任何想法?
答
与-unchecked
编译,你会看到一个警告,型式测试expected: T
将总是返回true,由于类型擦除。
scala> def foo[T](a: Any) = a match {
| case _: T => "always will match!"
| }
<console>:22: warning: abstract type T in type pattern T is unchecked since it is eliminated by erasure
case _: T => "always will match!"
^
foo: [T](a: Any)java.lang.String
scala> foo[String](0)
res3: java.lang.String = always will match!
看到有您的类传入您可以使用Class#isInstance
代替。在您的代码中,这看起来像:
case expected if clazz.isInstance(expected) => success("got exception " + expected)
在一个自包含的示例中。下面我们通过一个Manifest[T]
含蓄,这是一种方式来获得编译器将一个额外的参数,以获得该类型擦除扔掉信息:
scala> def foo[T: ClassManifest](a: Any) = manifest[T].erasure.isInstance(a)
foo: [T](a: Any)(implicit evidence$1: Manifest[T])Boolean
scala> foo[String](new {}) // compiler passes Manifest[String] here
res4: Boolean = false
scala> foo[String]("")
res5: Boolean = true
延伸阅读:
非常感谢你的提示 –