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