使用 scalamock 将模拟对象用作 scala 中的隐式对象



我正在使用带有各种具体导数的特质定义,并隐含将依赖关系注入对象,并在单元测试时模拟系统的某些部分。 问题在于,当一个类型的模拟版本用作隐式声明时,它与消费对象中的 scala 不匹配。

这是我设置的简化版本。 有没有办法使用模拟使 Test1 工作。 Test2 工作正常,但难以维护并且需要太多设置。

型号:

case class User (first: String, last: String, enabled: Boolean)

组件定义:

trait DataProviderComponent {
  def find[T](id: Int): Try[T]
  def update[T](data: T): Try[T]
}

具体组件实现之一:

class DbProvider extends DataProviderComponent {
  override def find[T](id: Int): Try[T] = { ... }
  override def update[T](data: T): Try[T] = { ... }
}

组件在系统中某处的隐式用法:

implicit val provider = new DbProvider()
class UserRepsitory(implicit provider: DataProviderComponent) {
  def userEnabled(id: Int): Boolean = {
    val user = provider.find[User](id)
    user.isSuccess && user.get.enabled
  }
}

单元测试1,试图模拟提供者以隔离存储库测试。 这不起作用,存储库类与隐式不匹配,即使它基于 DataProviderComponent:

class UserRepository$Test1 extends FunSuite with Matchers with MockFactory {
  test("invalid data request should return false") {
    implicit val  mockProvider = mock[DataProviderComponent]
    (mockProvider.find[User] _).expects(13).returns(Failure[User](new Exception("Failed!")))
    val repo = new UserRepsitory()
    repo.userEnabled(13) should be (false)
  }
}

此版本确实有效,但难以维护,并且需要更多代码:

class UserRepository$Test2 extends FunSuite with Matchers with MockFactory {
  test("invalid data request should return false") {
    class FakeProvider extends DataProviderComponent {
      override def find[T](id: Int): Try[T] = ???
      override def update[T](data: T): Try[T] = Failure[T](new Exception("Failed!"))
    }
    implicit val provider = new FakeProvider()
    val repo = new UserRepsitory()
    repo.userEnabled(13) should be (false)
  }
}

有没有办法使用模拟类型作为注入的隐式 - 或者是否有另一种我应该使用的 scala-thonic 模式来解决这个问题?

这段代码为我成功编译并运行

斯卡拉:2.10.4

标量测试:2.1.0-RC2

scalaMock: 3.1.RC1

import org.scalamock.scalatest.MockFactory
import org.scalatest.{FunSuite, Matchers}
import scala.util.{Failure, Try}
case class User(first: String, last: String, enabled: Boolean)
trait DataProviderComponent {
  def find[T](id: Int): Try[T]
  def update[T](data: T): Try[T]
}
class DbProvider extends DataProviderComponent {
  override def find[T](id: Int): Try[T] = {
    ???
  }
  override def update[T](data: T): Try[T] = {
    ???
  }
}
class UserRepository(implicit provider: DataProviderComponent) {
  def userEnabled(id: Int): Boolean = {
    val user = provider.find[User](id)
    user.isSuccess && user.get.enabled
  }
}
class UserRepositoryTest extends FunSuite with Matchers with MockFactory {
  test("invalid data request should return false") {
    implicit val mockProvider: DataProviderComponent = mock[DataProviderComponent]
    (mockProvider.find[User] _).expects(13).returns(Failure[User](new Exception("Failed!")))
    val repo = new UserRepository()
    repo.userEnabled(13) should be(false)
  }
}

相关内容

  • 没有找到相关文章

最新更新