【问题标题】:mock case class in scala : Mockitoscala中的模拟案例类:Mockito
【发布时间】:2016-05-12 10:40:50
【问题描述】:

在我的游戏应用程序中,我打算模拟一个案例类。我可以这样做,但它会创建一个所有成员变量都为 null 的对象。 有没有办法创建案例类的模拟对象,以便该对象可以初始化一些成员?

case class User(name: String, address: String)    
val mockUser = mock[User]
user.name // null
user.address //null

如何创建一个 mockUser 以便我可以为名称和地址分配一些值?

编辑:

我需要模拟对象的能力,因为我想拥有成员方法之一的预定义行为。 (此成员方法调用外部服务,我不想在进行单元测试时调用外部服务。)成员方法在我要测试的另一个成员方法内部调用。

【问题讨论】:

  • 模拟案例类真的有用吗?而不是用假值创建测试实例?
  • 我需要一个模拟,因为我不希望类的某些方法不被执行,而是我想要一个预定义的行为。问题已更新。

标签: scala testing mockito


【解决方案1】:

应该这么简单:

when(mockUser.name).thenReturn("Bob")

至于:

您永远不需要模拟案例类。这就像“嘲笑一个 整数”。

错误。 (恕我直言)

val mockUser = User("mockName", "mockAddress") 有什么问题?

如果你不认为有什么问题,那就没什么

val mockFoo = FooWith20Properties("1", "2", "3",..."20")

您的测试可以工作,但您错过了使用模拟框架来减少测试样板的要点。

话虽如此,那些认为案例类应该是最终的和那些不认为是最终的之间似乎确实存在分歧。如果你将你的标记标记为final,那么如果不求助于同样有争议的东西,比如Powermock,那么mocking 是行不通的。

【讨论】:

  • 您可以编写帮助函数,以便在创建对象时分解出测试样板。没必要嘲讽。如果您必须创建许多未使用的不相关值,则表明您的数据可能会从重构中受益。
【解决方案2】:

您永远不需要模拟案例类。这就像“模拟一个整数”。

val mockUser = User("mockName", "mockAddress") 有什么问题?

【讨论】:

  • 我需要模拟对象的能力,因为我想拥有成员方法之一的预定义行为。 (此成员方法调用外部服务,我不想在进行单元测试时调用外部服务。)成员方法在另一个我要测试的成员方法内部调用。
  • 这个设计有很多错误,我什至不知道从哪里开始。你不应该模拟案例类......案例类不应该调用外部服务......你不应该模拟你正在测试的对象......对外部服务的调用应该被隔离,这样你就可以自己存根它们...但是,在更基本的层面上,您究竟打算如何在您刚刚模拟的对象上“测试成员方法”????
【解决方案3】:

我会将您的外部服务调用从案例类中移出,进入 service 类,然后模拟该服务类。

通常,案例类代表数据。如果数据和使用该数据的函数(例如您的外部调用)是分开的,它会导致代码更整洁。

我会写这样的代码

case class User(name: String, address: String)

class UserService {
  def callExternalService(user: User): Result = ???
}

val testUser = User("somebody", "somewhere")
val mockService = mock[UserService]
when(mockService.callExternalService(testUser)).thenReturn(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多