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

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

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

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

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

3203閲覧

Junit内のprivateメソッド呼び出し時のDIに関して

Hanbe.T

総合スコア36

JUnit

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

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2018/04/28 14:08

Junitにてprivateメソッドを試験する際に、DIが実施されず、NullPointExceptionが発生してしまいます。(下記のソースの「otherclass」にnullが格納されている。)

privateメソッドを直接呼び出した際に、DIを実施する方法はありますでしょうか?
諦めて、publicメソッド経由で試験するしかないのでしょうか?

当方、Javaの経験は5年近くあるのですが、Springを使用した経験があまりなく、理解が不足している個所が多々あるかと思いますが、ご容赦ください。指摘していただけると幸いです。

※DIがどのタイミングで実施されるかを正しく理解していません。
privateメソッドをテストする際はインスタンスを自分で生成しているため、DIが行われていないのかと考えております。

下記のような構成で試験を行っています。
※publicメソッドをテストした際にエラーは発生していないので、基本的な設定関連は問題ないと考えています。

Java

1// テスト対象のクラス 2// Base.java 3@Service 4public abstract class BaseImpl implements Base { 5 @Autowired 6 OtherClass otherclass; 7 8 public void publicMethod() { 9 privateMethod(); 10 } 11 // ここをテストしたい 12 private void privateMethod(String str1, String str2) { 13 // ↓NullPointExceptionが発生する。 14 otherclass.publicMethod(); 15 } 16 17 private abstarct void abstractMethod(); 18} 19 20// テスト対象が抽象クラスのため、Baseクラスを継承したテスト用のクラスを用意 21// DummyMain.java 22public class DummyImpl implements Dummy { 23 public void mainDummy() { 24 publicMethod(); 25 } 26 private void adstractMethod() { // 省略 } 27} 28 29// テスト用のクラス 30// TestBaseClass.java 31public class TestBaseClass { 32 @Autowired 33 DummyImpl dummyimpl; 34 35 @Test 36 public void testPublicMethod() { 37 dummyimpl.publicMethod(); 38 } 39 40 @Test 41 public void testPrivateMethod() { 42 DummyImpl target = new DummyImpl (); 43 Method method = DummyImpl .class.getDeclaredMethod("privateMethod", String.class, String.class); 44 method.setAccessible(true); 45 method.invoke(target, "文字列1", "文字列2") 46 } 47}

お手数ですが、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

method.invokeしてるところ 自分でインスタンス作らないで @Autowiredした dummyimpl ではだめですか?

java

1@Test 2public void testPrivateMethod() { 3 //DummyImpl target = new DummyImpl (); 4 Method method = DummyImpl .class.getDeclaredMethod("privateMethod", String.class, String.class); 5 method.setAccessible(true); 6 method.invoke(dummyimpl, "文字列1", "文字列2") 7}

以前、Mock使うときに記事でまとめたことがあるので、参考になれば
MockitoとPowerMockの使い分け

投稿2018/04/28 14:44

編集2018/05/12 12:24
euledge

総合スコア2404

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

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

Hanbe.T

2018/04/29 07:44

確かに、dummyimplを使用する際は問題がないのだから、それを使用すればよかったのですね。 privateメソッドの場合は、新しいインスタンスを生成してテストするという誤った認識でいたため、気づきませんでした。 今手元に該当のソースがないので、確認できませんが、試してみます。 ありがとうございました。
Hanbe.T

2018/05/12 11:02

大変遅くなりもうしわけありません。 無事テストを実施することができました。 ありがとうございました。
guest

0

private、publicの問題ではなく、単純にフィールド「otherclass」に有効なオブジェクトが代入されていないだけと思いますが。

投稿2018/04/28 14:20

HogeAnimalLover

総合スコア4830

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

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

Hanbe.T

2018/04/29 07:42

確かにおっしゃる通りなのですが、どうしたら、「「otherclass」に有効なオブジェクトが代入できる」かをお聞きしたかった次第です。 言葉が足らず、申し訳ありませんでした。
HogeAnimalLover

2018/04/29 10:54

え?それはnew演算子で新規にオブジェクトを作成するか、既存のオブジェクトを対象に指し示させるかです。「プリミティブな型でない変数(この場合はフィールド)は有効領域を割り当てるまでは利用できません。」これはSpringとかライブラリの特別な性質ではなく、javaの一般的な基礎事項です。失礼ながら、5年の経験があるならば当然既知であることだ思いますが。 ステートメント「otherclass.publicMethod();」を実行するためには、当然ですが事前にオブジェクト「otherclass」の中身がなければいけません。
Hanbe.T

2018/04/30 11:21

返答が遅くなり、申し訳ありません。 指摘内容は確かに正しいのですが、Autowiredを使用しているのですから、明示的にインスタンスを生成したり、別のオブジェクトを代入したりする必要はありません(できません。DIを利用するメリットがないため)。 今回お聞きしたいのは、 「なぜNullPointExceptionが発生するのか」ではなく、「どうしたらDIが実施できるのか」になります。 ※「どうしたら「otherclass」に有効なオブジェクトが代入できるのか」というのはまだ言葉足らずでした。言葉がたりず、それた解答をさせてしまった事に対する補足であったのに、まだ不足の状態で申し訳ありません。 教えを乞うてる立場で大変恐縮ではありますが、質問およびソースコードを再読の上、もし解決方法をご教示いただければ、幸いです。
HogeAnimalLover

2018/04/30 11:31

失礼しました。おそらく、自分の存じない機能を前提とされているようなので無視してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問