2016-05-12 158 views
2

在我的應用程序中,我打算模擬一個案例類。我能夠這樣做,但它創建了一個所有成員變量都爲空的對象。 有沒有辦法創建一個案例類的模擬對象,使對象可以有一些成員初始化?在Scala中模擬案例類:Mockito

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

我該如何創建一個mockUser,以便我可以爲名稱和地址分配一些值?

編輯:

我需要模擬對象,因爲我想擁有的成員方法的一個預定義行爲的能力。 (這個成員方法調用外部服務,我不想在進行單元測試時進行外部服務調用。)成員方法在另一個成員方法中調用,我想測試它。

+0

代碼是它模擬case類真的有用嗎?而不是用假值創建測試實例? – cchantep

+0

我需要一個模擬,因爲我不想要類的某些方法不被執行,而是我想要一個預定義的行爲。問題已更新。 – konquestor

回答

5

你應該永遠不需要模擬案例類。這就像「嘲笑一個整數」。

val mockUser = User("mockName", "mockAddress")怎麼了?

+0

我需要能夠嘲笑的對象,因爲我想有一個成員方法的預定義行爲。 (這個成員方法調用外部服務,我不想在進行單元測試時進行外部服務調用。)成員方法在另一個成員方法中調用,我想測試它。 – konquestor

+4

這個設計有太多的錯誤,我甚至不知道從哪裏開始。你不應該嘲笑案例類...案例類不應該調用外部服務...你不應該嘲笑你正在測試的對象...調用外部服務應該是孤立的,以便你可以自己把它們存根出來......但是,在更基本的層面上,你打算如何在一個你剛剛嘲笑的物體上「測試成員方法」? – Dima

1

它應該是如此簡單:

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

至於:

你不應該需要模擬case類。這就像「嘲笑 整數」。

假。 (恕我直言)

val mockUser = User(「mockName」,「mockAddress」)有什麼問題?

什麼,如果你不認爲有什麼不對

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

你的測試工作,但你已經錯過了用諷刺的框架,以減少測試樣板點。

話雖如此,那些認爲案例類應該是最終的和那些沒有的案例類似。如果你標記你的最終,那麼嘲笑不會訴諸如Powermock等同樣有爭議的東西。

0

我會將您的外部服務呼叫移出案例類,轉換爲服務類,然後模擬此服務類。

通常,案例類別代表數據。如果數據和使用這些數據的功能(例如你的外部呼叫)是分開的,它會導致整潔的代碼。

我會寫這樣

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(...)