如何使用scala在lagom中编写NoHostAvailableException的测试用例?

时间:2019-03-26 08:49:21

标签: cassandra lagom sca

我有一个exceptionHandler部分函数,​​它与相应的异常匹配并相应地引发。 我应该为NoHostAvailableException编写一个测试用例,但无法使用模拟抛出异常。

我已经制作了一个模拟服务器,可以将嵌入式Cassandra嵌入Lagom。

这是部分函数。

private val handleException: PartialFunction[Throwable, Future[List[MonitoringData]]] = {
    case noHostAvailableException: NoHostAvailableException => throw new CassandraNotAvailableException(TransportErrorCode
        .fromHttp(Error.CassandraNotAvailableErrorCode), Error.ErrorMessageForCassandraNotAvailable)

    case _ => throw new TransportException(TransportErrorCode.InternalServerError, Error.ErrorMessageForInternalServerError)
}

这是测试用例。

"not be able to interact with the database in" {
    when(mockReadDAO.getData)
        .thenThrow(NoHostAvailableException)
    assert(thrown.isInstanceOf[NoHostAvailableException])
}

编译器不将NoHostAvailableException作为值。

1 个答案:

答案 0 :(得分:1)

请注意类型

之间的区别
NoHostAvailableException

new NoHostAvailableException(...)

val e: NoHostAvailableException = new NoHostAvailableException(...)

从概念上讲,这类似于类型Int和值42之间的区别

val i: Int = 42

错误的含义

class com.datastax.driver.core.exceptions.NoHostAvailableException is not a value

告诉我们我们在期望值的位置使用类型。因此尝试

when(mockReadDAO.getData).thenThrow(new NoHostAvailableException(...))

代替

when(mockReadDAO.getData).thenThrow(NoHostAvailableException)

由于NoHostAvailableException构造函数将java.util.Map作为参数,因此尝试像这样提供空的java.util.HashMap

val emptyHashMap = new java.util.HashMap[InetSocketAddress, Throwable]() 
when(mockReadDAO.getData).thenThrow(new NoHostAvailableException(emptyHashMap))