Empecé a aprender Scala ayer, así que soy bastante nuevo. Una cosa que me gusta hacer cuando estoy aprendiendo un nuevo idioma es tratar de crear una lib de micro-TDD.Scala: ¿cómo hago un método "assertThrows"?
Esto es lo que tengo hasta ahora:
def assert(condition: Boolean, message: String) {
if(!condition){ throw new AssertionError(message) }
}
def assertThrows[E](f: => Unit) {
try {
f
} catch {
case e: E => { return }
case _: Exception => { }
}
throw new AssertionError("Expected error of type " + classOf[E])
}
El código para assert
funciona muy bien, pero estoy teniendo problemas con dos assertThrows
.
- Parece que no puedo usar
E
en la última línea. No importa lo que haga, obtengo unclass type expected but E found error
. - Si quito E de la última línea (sustituyéndolo por
throw new AssertionError("error expected")
, por ejemplo) me sale esto:warning: abstract type E in type pattern is unchecked since it is eliminated by erasure
Creo que los dos problemas que tengo están relacionados con la forma en Scala (y, probablemente, java) trata sobre tipos abstractos y cómo se hacen.
¿Cómo puedo solucionar mi assertThrows?
Puntos de bonificación: es la forma en que estoy especificando un "tipo de bloque" (f: => Unit
) ¿correcto?
Una pregunta que no hace mucho tiempo podría ser de ayuda: http://stackoverflow.com/questions/7699709/scala-expected-snippet –