junitでのテスト時に、生成したインスタンスのメソッドを一部だけモック化したい場合があり、やり方をちょくちょく忘れるので記録
junit version
pom.xml
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
以下のようなサンプルクラスを使います
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String greet() {
StringBuilder sb = new StringBuilder();
sb.append(sayName()).append("\n").append(sayAge()).append("\n");
return sb.toString();
}
String sayName() {
return "Hello, my name is " + name + ".";
}
String sayAge() {
return "I am " + age + " years old.";
}
}
サンプルコード
@Test
public void test() {
Person person1 = new Person("Alice", 20);
System.out.println(person1.greet());
// spy
Person person2 = Mockito.spy(person1);
Mockito.when(person2.sayName()).thenReturn("Hello, my name is Bob.");
System.out.println(person2.greet());
}
出力結果
Hello, my name is Alice.
I am 20 years old.
Hello, my name is Bob.
I am 20 years old.
上記のように生成したインスタンスに対してspyを用意し、特定のメソッドをwhen + thenReturn
でモック化します
- 対象メソッドがprivateの場合失敗する
- 今回のように
thenReturn()
を使用する場合はメソッド内部の処理が実行されるので、実行せず指定した返却値だけ返したい場合はdoReturn()
を使用