Mockitoでfinalクラスをモック化 (3)

2015-08-19T15:34:57+09:00 Java

今まで

というように書いてきたんですが、知ってはいたものの書いてなかったっていうのもあるので改めて書く事にした

でその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'
}

TabLayoutでaddTabした直後にselectしてもスクロールされない件 twitter4j+mockwebserver