MockとSpyの違い(Mockit)
TL;DR
機能/特徴 | Mock | Spy |
---|---|---|
基本的な特性 | 完全にモックされたオブジェクト | 実際のオブジェクトのラッパー |
デフォルト動作 | 全てのメソッド呼び出しがモック動作 (通常はnullやデフォルト値を返す) | 実際のメソッドが呼び出される |
メソッドのオーバーライド | 指定したメソッドだけモック動作を設定可能 | 任意のメソッドの動作をモックに変更可能 |
使用シナリオ | 実際のオブジェクト/メソッドの動作を完全に避けたい場合 | ほとんどの実際の動作を保持しつつ、一部のメソッドの動作だけをカスタマイズしたい場合 |
メモリ使用 | 実際のオブジェクトは作成されないので、通常は軽量 | 実際のオブジェクトが存在するため、そのオブジェクトのメモリを使用する |
初期化 |
@Mock アノテーションまたは Mockito.mock() を使用 |
@Spy アノテーションまたは Mockito.spy() を使用 |
副作用 | 実際の副作用は発生しない | メソッドがモックされていない場合、実際の副作用が発生する可能性がある |
sample
package com.example;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
public class SpyAndMockExampleClass {
@Test
public void testSayHelloWithSpy() {
SampleService spiedService = Mockito.spy(new SampleService());
SampleService mockedService = Mockito.mock(SampleService.class);
Mockito.when(spiedService.sayHello()).thenReturn("Mocked Hello");
Mockito.when(mockedService.sayHello()).thenReturn("Mocked Hello");
assertEquals("Mocked Hello", spiedService.sayHello());
assertEquals("Goodbye", spiedService.sayGoodbye());
assertEquals("Mocked Hello", mockedService.sayHello());
assertEquals(null, mockedService.sayGoodbye());
}
public class SampleService {
public String sayHello() {
return "Hello";
}
public String sayGoodbye() {
return "Goodbye";
}
}
}