在我的play应用程序中,我打算模拟一个case类。我可以这样做,但它创建了一个所有成员变量都为null的对象。有没有一种方法可以创建case类的mock对象,这样对象就可以初始化一些成员?
case class User(name: String, address: String)
val mockUser = mock[User]
user.name // null
user.address //null
如何创建mockUser,以便为名称和地址分配一些值?
编辑:
我需要模拟对象的能力,因为我希望有一个成员方法的预定义行为。(这个成员方法调用一个外部服务,我不想在进行单元测试时调用外部服务。)该成员方法是在另一个成员方法内部调用的,我想测试它。
它应该像这样简单:
when(mockUser.name).thenReturn("Bob")
远至:
您永远不应该需要模拟案例类。这就像"嘲笑integer".
错误。(IMHO)
val mockUser=User("mockName","mockAddress")有什么问题?
如果你不认为有什么问题,那就没什么了
val mockFoo = FooWith20Properties("1", "2", "3",..."20")
您的测试会起作用,但您错过了使用模拟框架来减少测试样板的要点。
话虽如此,那些认为案例课程应该是最终课程的人和那些不认为应该的人之间似乎确实存在分歧。如果你在决赛中获胜,那么如果不采用Powermock等同样有争议的方法,嘲讽是行不通的。
您应该永远不需要模拟案例类。这就像"嘲笑一个整数"。
val mockUser = User("mockName", "mockAddress")
出了什么问题?
我会将您的外部服务调用从case类移到服务类中,然后模拟这个服务类。
通常,事例类表示数据。如果数据和使用该数据的函数(例如,外部调用)是分开的,那么代码会更整洁。
我会写类似的代码
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(...)