読者です 読者をやめる 読者になる 読者になる

JMockito を使ってみる ( static メソッド、private メソッドのモック化 )

JMockito を使って1. static メソッドのモック化2. private メソッドのモック化を行なうサンプルコードを書いてみたので、メモを残しておきます。

今回は Maven 使ってやることにしました。pom.xml の記述内容は以下に。

JMockit - Tutorial - Introduction
http://jmockit.org/tutorial/Introduction.html#runningTests

※ .jar ダウンロードしてやりたい場合は以下からダウンロード。

・The JMockit testing toolkit
http://jmockit.org/index.html

細かいところはドキュメントに譲りまして ( おいおい・・・ )、テスト対象コードとそのテストケースだけ並べます。

1. static メソッドのモック化


* テスト対象コード

package jmockito.sample;

public class JMockitStaticSample {
  public static String staticMethod(String s) {
    String result = null;
    // something...
    return result;
  }
}


* テストケース

package jmockito.sample;

import mockit.Expectations;
import mockit.Mocked;

import org.junit.Assert;
import org.junit.Test;

public class JMockitStaticSampleTest {
  @Mocked 
  private JMockitStaticSample jss;
  
  @Test
  public void test() {
    new Expectations() {{
      JMockitStaticSample.staticMethod("hoge"); result = "staticMethod hoge";
      JMockitStaticSample.staticMethod("uga"); result = "staticMethod uga";
     }};
    
    Assert.assertEquals("staticMethod hoge", JMockitStaticSample.staticMethod("hoge"));
    Assert.assertEquals("staticMethod uga", JMockitStaticSample.staticMethod("uga"));
  }
}


2. private メソッドのモック化


* テスト対象コード

package jmockito.sample;

public class JMockitPrivateSample {
  private int privateMethod1(int i) {
    // something...
    return 0;
  }

  private String privateMethod2(String s) {
    // something...
    return null;
  }
  
  public int callPrivateMethod1(int i) {
    return privateMethod1(i);
  }
  
  public String callPrivateMethod2(String s) {
    return privateMethod2(s);
  }
}

* テストケース

package jmockito.sample;

import static mockit.Deencapsulation.invoke;
import mockit.Expectations;

import org.junit.Assert;
import org.junit.Test;

public class JMockitPrivateSampleTest {
    
  @Test
  public void test() {
    JMockitPrivateSample jps = new JMockitPrivateSample();
    
    new Expectations(JMockitPrivateSample.class) {{
      invoke(jps, "privateMethod1", 1); result = 1;
      invoke(jps, "privateMethod2", "hoge"); result = "hoge";
    }};
    
    Assert.assertEquals(1, jps.callPrivateMethod1(1));
    Assert.assertEquals("hoge", jps.callPrivateMethod2("hoge"));
  }
}

※ private メソッドだけを部分的にモック化 ( Partial mocking ) している感じです。


全然ちゃんと読んでませんが、ドキュメントは以下あたりに。

JMockit - Tutorial - Mocking
http://jmockit.org/tutorial/Mocking.html


相当に粗い内容ですが、以上です。

[ 環境情報 ]
Windows 7 SP1
JMockit 1.18
Java SE 8 Update 25