2016-05-12 4 views
2

私の演奏アプリケーションでは、私はケースクラスを模擬しようと考えています。私はそうすることができますが、すべてのメンバー変数がnullのオブジェクトを作成します。 オブジェクトがいくつかのメンバを初期化できるように、ケースクラスのモックオブジェクトを作成する方法はありますか?モックケースクラスのスカラー:Mockito

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

名前とアドレスにいくつかの値を割り当てることができるようにmockUserを作成するにはどうすればよいですか?

編集:

私はメンバーの方法の一つの事前に定義された振る舞いを持つようにしたいので、私は、オブジェクトを模擬する能力が必要です。 (このメンバメソッドは外部サービスを呼び出し、ユニットテストを実行している間は外部サービスコールを必要としません)。メンバメソッドは、テストしたい別のメンバメソッドの中で呼び出されます。

+0

のようなコードを記述しますがケースクラスをモックすることは本当に便利ですか?偽の値でテストインスタンスを作成する代わりに? – cchantep

+0

クラスの特定のメソッドが実行されないようにしたいので、モックが必要です。代わりに、あらかじめ定義された動作が必要です。質問が更新されました。 – konquestor

答えて

5

ケースクラスを模擬する必要はありません。それは "整数を模倣する"のようなものです。

val mockUser = User("mockName", "mockAddress")の何が問題になっていますか?

+0

メンバーメソッドの1つの動作を定義したいので、オブジェクトをモックする能力が必要です。 (このメンバメソッドは外部サービスを呼び出し、ユニットテストを実行している間は外部サービスコールを必要としません)。メンバメソッドは、テストしたい別のメンバメソッドの中で呼び出されます。 – konquestor

+4

このデザインには非常に間違いがあります。どこから始めたらいいのか分かりません。あなたはケースクラスを嘲笑してはいけません...ケースクラスは外部サービスを呼び出すべきではありません...あなたがテストしているオブジェクトを嘲笑してはいけません...外部サービスへの呼び出しは分離されていなければなりません...しかし、より基本的なレベルでは、世界でどのようにあなたが嘲笑されたオブジェクトに対して "メンバーメソッドをテストする"ことを計画していますか???? – Dima

1

それは、このような単純なする必要があります:

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

限り:

あなたはケースクラスをモックする必要はありません。それは " 整数を嘲笑"のようなものです。

偽。 (IMHO)

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