无法模拟redisclient类-方法管道不重写任何内容

cgh8pdjw  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(462)

我有一个 CacheService 类,该类使用scala redis库的示例

class CacheService(redisClient: RedisClient) extend HealthCheck {
  private val client = redisClient

  override def health: Future[ServiceHealth] = {
    client.info
    ...
  }

在我的单元测试中,我模拟客户机示例并测试服务

class CacheServiceSpec extends AsyncFlatSpec with AsyncMockFactory {
  val clientMock = mock[RedisClient]
  val service = new CacheService(clientMock)

  "A cache service" must "return a successful future when healthy" in {
    (clientMock.info _).expects().returns(Option("blah"))

    service.health map {
      health => assert(health.status == ServiceStatus.Running)
    }
  }
}

但是我得到了这个编译错误

Error:(10, 24) method pipeline overrides nothing.
Note: the super classes of <$anon: com.redis.RedisClient> contain the following, non final members named pipeline:
def pipeline(f: PipelineClient => Any): Option[List[Any]]
  val clientMock = mock[RedisClient]

到目前为止,我的研究表明Scalamock4不能模仿同伴对象。作者建议用依赖注入重构代码。
我是否正确地执行了di(我选择了构造函数args注入,因为我们的代码库仍然相对较小且简单)?似乎作者建议在客户端示例上放置一个 Package 器。如果是这样,我正在寻找一种惯用的方法。
我应该麻烦换一个redis库吗?根据redis.io的建议,正在被主动维护的库也使用伴随对象。我个人认为这不是这些图书馆的问题。
如有任何进一步的建议,我将不胜感激。我的目标是为我们的外部服务(redis、postgres数据库、电子邮件等)创建一个至少可测试的健康检查。批评是受欢迎的,因为我还是scala生态系统的新手。

vawmfj5a

vawmfj5a1#

我是否正确地执行了di(我选择了构造函数args注入,因为我们的代码库仍然相对较小且简单)?似乎作者建议在客户端示例上放置一个 Package 器。如果是这样,我正在寻找一种惯用的方法。
是的,你是对的,这似乎是一个已知的问题(link1)。理想情况下,客户机示例周围需要一个 Package 器。一种方法是创造一种有方法的特质 connect 并扩展到 RedisCacheDao 并实施 connect 方法在需要时为您提供客户端示例。然后,您所要做的就是模拟这个连接接口,您就可以进行测试了。
另一种方法是使用嵌入式redis进行单元测试,尽管它通常用于集成测试。您可以启动一个简单的redis服务器,在那里通过代码运行测试,并在测试完成后关闭它。
我应该麻烦换一个redis库吗?根据redis.io的建议,正在被主动维护的库也使用伴随对象。我个人认为这不是这些图书馆的问题。
你当然可以这么做。我更喜欢绝地武士,因为它很简单,而且它的性能比scala redis(在执行mget时)更好。
如果有用请告诉我!!

相关问题