LoginSignup
1
2

MockとSpyの違い(Mockito)

Posted at

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";
		}
	}
}
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2