Mockitoでfinalクラスをモック化 (3)
今まで
というように書いてきたんですが、知ってはいたものの書いてなかったっていうのもあるので改めて書く事にした
でそのfinalクラスをモック化出来るようにする方法はMockitoではなくPowerMockを使う
SampleTest.java
package sample;
import org.junit.Test;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
public class SampleTest {
@Test
public void test() {
Sample sample = mock(Sample.class);
when(sample.say()).thenReturn("fuga");
assertThat(sample.say()).isSameAs("hoge");
}
}
まぁこのSampleクラスはfinalクラスだったとする。そうした場合にこのテストを動かすと
というような結果になるはず。んまぁ今まで散々言ってきたMockito自体がfinalクラスをサポートしていない為っていう事なので、これをPowerMockを使うように置き換える
package sample;
import org.junit.Rule;
import org.junit.Test;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.rule.PowerMockRule;
import static org.assertj.core.api.Assertions.*;
import static org.powermock.api.mockito.PowerMockito.*;
@PrepareForTest(Sample.class)
public class SampleTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
@Test
public void test() {
Sample sample = mock(Sample.class);
when(sample.say()).thenReturn("fuga");
assertThat(sample.say()).isSameAs("hoge");
}
}
※import staticするのがMockitoのじゃないのは注意
っていうようにして実行すると
というような結果になる。@Ruleをしなくても@RunWith(PowerMockRunner.class)を使えば良いけど、一定の環境下においてはその@RunWithが使う事が出来ないような事象の場合もある
ちなみに余談として、@Ruleでやるのはいかんという意見もあるようで ( http://irof.hateblo.jp/entry/20130517/p1 )
んまぁどの方法を使ってfinalクラスをモック化出来るようにするかっていう所はケースバイケースって事で
余談: build.gradle
どのライブラリ必要なのか一応メモっておく
apply plugin: "java"
repositories {
jcenter()
}
dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.assertj:assertj-core:2.1.0'
testCompile 'org.mockito:mockito-all:1.10.19'
testCompile 'org.powermock:powermock-core:1.6.2'
testCompile 'org.powermock:powermock-api-mockito:1.6.2'
testCompile 'org.powermock:powermock-module-junit4:1.6.2'
testCompile 'org.powermock:powermock-module-junit4-rule:1.6.2'
testCompile 'org.powermock:powermock-classloading-base:1.6.2'
testCompile 'org.powermock:powermock-classloading-xstream:1.6.2'
}