【问题标题】:How to write test case for NoHostAvailableException in lagom with Scala?如何使用 Scala 在 lagom 中为 NoHostAvailableException 编写测试用例?
【发布时间】:2019-08-16 14:12:39
【问题描述】:

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

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

这是偏函数。

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 作为值。

【问题讨论】:

  • 你为什么使用 sca - 服务组件架构标签?
  • 我添加了 Scala 标记,但我的错误忽略了 sca。

标签: scala cassandra lagom


【解决方案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))

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    相关资源
    最近更新 更多