質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

16471閲覧

Junit+PowerMockでPrivateメソッドをモック化したい

miya1145

総合スコア7

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/05/31 14:24

前提・実現したいこと

どなたか、解決策をご教示いただけますでしょうか。

Javaにて、JUnit+PowerMockでテストを行っております。

privateメソッド(下ソース:SampleProp#getPropValue)をMock化しようとしたところ、
SamplePropTest#test001 メソッドの
. PowerMockito.when(mock, "getPropValue", anyObject(), eq("AAA")).thenReturn("AAAValue");
の場所で、以下のエラーが発生してしまいました。

もう1つ引数なしのメソッド「duplicateCheck」をモック化しているのですが、
こちらはwhenの時点でメソッド内に入らないのですが、
「getPropValue」は when~の時点でメソッド内に入ってしまいます。

引数の書き方に問題があるのでしょうか?

お手数をおかけいたしますが、よろしくお願いいたします。

.

発生している問題・エラーメッセージ

java.lang.NullPointerException at sample.SampleProp.getPropValue(SampleProp.java:45) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at sample.SamplePropTest.test001(SamplePropTest.java:44) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:316) at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:300) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:288) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:208) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:147) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:121) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:123) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:121) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

該当のソースコード

Java

1package sample; 2 3import java.io.FileInputStream; 4import java.util.Properties; 5 6/** 7 * テスト対象クラス. 8 * 9 * @author miyako 10 */ 11public class SampleProp { 12 13 private static SampleProp __instance = new SampleProp(); 14 15 private SampleProp(){ 16 } 17 18 public static synchronized SampleProp getInstance() { 19 return __instance; 20 } 21 22 public synchronized void load() throws Exception { 23 24 Properties prop = new Properties(); 25 FileInputStream fis = null; 26 27 try { 28 this.duplicateCheck(); 29 30 fis = new FileInputStream("aaa.properties"); 31 prop.load(fis); 32 33 String item = this.getPropValue(prop, "myid"); 34 35 } 36 finally { 37 if (fis != null) { 38 try { 39 fis.close(); 40 } catch (Exception e) {} 41 } 42 } 43 } 44 45 private String getPropValue(Properties prop, String key) 46 throws Exception { 47 48 String ret = prop.getProperty(key); 49 if (ret == null) { 50 ret = "Not Key."; 51 } 52 if (ret.isEmpty()) { 53 ret = "Not Value."; 54 } 55 56 return ret; 57 } 58 59 private void duplicateCheck() { 60 // 重複チェック処理 61 } 62}

Java

1package sample; 2 3import static org.mockito.Matchers.*; 4 5import org.junit.After; 6import org.junit.Before; 7import org.junit.Test; 8import org.junit.runner.RunWith; 9import org.powermock.api.mockito.PowerMockito; 10import org.powermock.core.classloader.annotations.PrepareForTest; 11import org.powermock.modules.junit4.PowerMockRunner; 12 13import junit.framework.TestCase; 14 15/** 16 * テストクラス. 17 * 18 * @author miyako 19 */ 20@RunWith(PowerMockRunner.class) 21@PrepareForTest({SampleProp.class}) 22public class SamplePropTest extends TestCase{ 23 24 public SamplePropTest(String name) { 25 super(); 26 } 27 28 @Before 29 public void setUp() throws Exception { 30 31 } 32 33 @After 34 public void tearDown() throws Exception { 35 36 } 37 38 @Test 39 public void test001() throws Exception{ 40 41 SampleProp mock = PowerMockito.spy(SampleProp.getInstance()); 42 PowerMockito.doNothing().when(mock, "duplicateCheck"); 43 44 PowerMockito.when(mock, "getPropValue", anyObject(), eq("AAA")).thenReturn("AAAValue"); 45 46 try { 47 //============================== 48 // テスト実施 49 //------------------------------ 50 mock.load(); 51 52 //============================== 53 // 結果確認 54 //------------------------------ 55 56 } 57 // 予期せぬ例外 58 catch(Throwable e) { 59 e.printStackTrace(); 60 fail(e.getMessage()); 61 } 62 // 後処理 63 finally { 64 } 65 66 } 67 68} 69

補足情報(FW/ツールのバージョンなど)

・JRE:1.7.80
・JUnit:4.12
・PowerMock:1.6.6
・Mockito:1.10.19
・Eclipse:4.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

privateメソッドを呼ぶのにはリフレクションで呼ぶ必要があります。

java

1 @Test 2 public void privateメソッドはPowerMockitoでモックできる() throws Exception { 3 SampleProp mockInstance= PowerMockito.mock(SampleProp.class); 4 PowerMockito.when(mockInstance, "getPropValue", anyObject(), eq("AAA"))).thenReturn("AAAValue"); 5 6 // privateメソッドにアクセスするためにリフレクションを使う 7 Method method = TestTargetClass.class.getDeclaredMethod("getPropValue"); 8 method.setAccessible(true); 9 10 assertThat((String) method.invoke(mockInstance), is("AAAValue")); 11 }

以前書いた記事がありますので、ご参考にどうぞ

投稿2018/05/31 16:24

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miya1145

2018/06/01 05:14

euledge様 お世話になります。質問投稿者「miya1145」です。 ご回答の程、ありがとうございました! ご紹介いただきました「MockitoとPowerMockの使い分け」の方の、 「publicメソッドから呼ばれるサブのprivateメソッドをモックする場合」 を実現したく思っております。 上記を参考に、以下のようなコードを書いてみたのですが、 「.withArguments(anyObject(), eq("AAA")).thenReturn("mockValue");」 のところで、実際の「getPropValue」の中に入りこんでしまい、NullPointerExceptionになってしまいました・・・。 お忙しいとは思いますが、アドバイスの程いただければ幸いです。 @Test public void publicメソッドから呼ばれるサブのprivateメソッドはspyでモックできる() throws Exception { SampleProp mockInstance = PowerMockito.spy(SampleProp.getInstance()); PowerMockito.when( mockInstance, MemberMatcher.method(SampleProp.class, "getPropValue", Properties.class, String.class)) .withArguments(anyObject(), eq("AAA")).thenReturn("mockValue"); mockInstance.load(); }
euledge

2018/06/01 07:41

https://github.com/euledge/mockito-sample に記事のソースコードを上げてあるので一度お試しください。 必要なライブラリとか設定なども見比べることができるかと思います。
miya1145

2018/06/03 12:59

euledge様 投稿が遅くなりまして、申し訳ございません。 お世話になります。質問投稿者「miya1145」です。 ご回答の程、ありがとうございました! 実ソースを以下に変更して(前提がおかしかったです申し訳ございません・・・)、    String item = this.getPropValue(prop, "AAA"); テストソースを以下に変更することで、期待の結果が得られました。 SampleProp mockInstance = PowerMockito.spy(SampleProp.getInstance());     ・・・ PowerMockito.doReturn("AAAValue").when(mockInstance, "getPropValue", anyObject(), eq("AAA")); euledge様のサイト等で、さらに精進していきたいと思います。 また質問が出てくると思いますが、その際には何卒よろしくお願いいたします。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問