如何比较结果类型是 subclass of abstract class 来匹配?

How to compare result type to be subclass of abstract class to match to?

我有一个带有签名的方法

def save(u: User): Future[Option[UserServiceError]]

我想用 Specs2 进行测试。

我有以下类型层次结构:

abstract class UserServiceError(message: String)
object UserAlreadyExist extends UserServiceError("User already exists")

然后,测试代码如下所示:

users.save(...) must beSome(users.UserAlreadyExist).await

所以我希望匹配器 beSome 能够理解 UserAlreadyExist 是方法签名中 UserServiceError 的子类型。

但是,它给我一个编译时类型检查错误

type mismatch;
[error]  found   : org.specs2.matcher.Matcher[scala.concurrent.Future[Option[core.model.services.UserService#UserAlreadyExist.type]]]
[error]  required: org.specs2.matcher.Matcher[scala.concurrent.Future[Option[core.model.services.UserService#UserServiceError]]]

我隐约觉得我在这里遗漏了一些非常基本的东西,比如 UserAlreadyExist.type 不应该符合 UserServiceError[without .type]

我哪里做错了?

我没有考虑到你可以在 beSome() 中使用匹配器,所以接下来的更改测试代码可以工作(参见 beEqualTo):

must beSome(beEqualTo(UserService.UserAlreadyExist)).await

我也将 UserServiceError 移到了 UserService 的伴随对象中。