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

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

ただいまの
回答率

90.61%

  • Java

    13538questions

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

  • Spring

    669questions

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

  • JUnit

    177questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 302

Hanbe.T

score 14

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

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

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

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

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

// テスト対象のクラス
// Base.java
@Service
public abstract class BaseImpl implements Base {
    @Autowired
    OtherClass otherclass;

    public void publicMethod() {
        privateMethod();
    }
    // ここをテストしたい
    private void privateMethod(String str1, String str2) {
        // ↓NullPointExceptionが発生する。
        otherclass.publicMethod();
    }

    private abstarct void abstractMethod();
}

// テスト対象が抽象クラスのため、Baseクラスを継承したテスト用のクラスを用意
// DummyMain.java
public class DummyImpl implements Dummy {
    public void mainDummy() {
        publicMethod();
    }
    private void adstractMethod() { // 省略 }
}

// テスト用のクラス
// TestBaseClass.java
public class TestBaseClass {
    @Autowired
    DummyImpl dummyimpl;

    @Test
    public void testPublicMethod() {
        dummyimpl.publicMethod();    
    }

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 16:44

    確かに、dummyimplを使用する際は問題がないのだから、それを使用すればよかったのですね。
    privateメソッドの場合は、新しいインスタンスを生成してテストするという誤った認識でいたため、気づきませんでした。

    今手元に該当のソースがないので、確認できませんが、試してみます。
    ありがとうございました。

    キャンセル

  • 2018/05/12 20:02

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

    ありがとうございました。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 16:42

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

    キャンセル

  • 2018/04/29 19:54

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

    ステートメント「otherclass.publicMethod();」を実行するためには、当然ですが事前にオブジェクト「otherclass」の中身がなければいけません。

    キャンセル

  • 2018/04/30 20:21

    返答が遅くなり、申し訳ありません。
    指摘内容は確かに正しいのですが、Autowiredを使用しているのですから、明示的にインスタンスを生成したり、別のオブジェクトを代入したりする必要はありません(できません。DIを利用するメリットがないため)。

    今回お聞きしたいのは、
    「なぜNullPointExceptionが発生するのか」ではなく、「どうしたらDIが実施できるのか」になります。
    ※「どうしたら「otherclass」に有効なオブジェクトが代入できるのか」というのはまだ言葉足らずでした。言葉がたりず、それた解答をさせてしまった事に対する補足であったのに、まだ不足の状態で申し訳ありません。

    教えを乞うてる立場で大変恐縮ではありますが、質問およびソースコードを再読の上、もし解決方法をご教示いただければ、幸いです。

    キャンセル

  • 2018/04/30 20:31

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    関数型IFを返却するメソッドのjUnitでの検証

    前提・実現したいこと 関数型IFを返却するメソッドの戻り値を検証したい場合、どうしたらいいでしょうか。 発生している問題・エラーメッセージ 以下のようなメソッドがあった場

  • 解決済

    Springの@Transactionalを無視させる

    DBUnitとJunitの組み合わせで業務ロジックをテストを行いたいです。 リスト処理概要 junit開始 → DBunitでセッション取得し、テストデータ投入 → 業務

  • 解決済

    Junit SuiteClassesアノテーションの引数を動的に指定したい

    Javaの初心者です。 Junitの@SuiteClassesアノテーションの引数にテストスイートクラスを指定するとありますが、 ここを動的引き渡したいです。 できることなら、プロ

  • 解決済

    APIのラッパークラスおよび実装クラスのテストについて

    ※業務関連の用語などをぼかして記述するため、一部あいまいになってしまいますが ご了承ください。 前提 現在Javaの開発で、将来のJavaバージョンアップに備え、SQL系のAP

  • 解決済

    Mockitoを使用したprivateメソッドのテストを実施したい

    前提・実現したいこと Mockitoを使用して、privateメソッドの単体テストを作成しています。 privateメソッド内でインスタンスをnewして、メソッド呼び出しをしている

  • 解決済

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

     前提・実現したいこと どなたか、解決策をご教示いただけますでしょうか。 Javaにて、JUnit+PowerMockでテストを行っております。 privateメソッド(下

  • 解決済

    JUnitの引数の確認の仕方

    Eclipse Mars JUnit  car.set(MAX_E); 上記のようなメソッドで、引数にセットする値が間違えていないかチェックする方法をご教示いただけませんか?

  • 解決済

    例外テストの書き方について

     前提・実現したいこと 例外テストの記述方法について教えてください。 様々なインプットに対して、対応した例外を投げるテストを作成したいと考えています。 インプットと期待例外

同じタグがついた質問を見る

  • Java

    13538questions

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

  • Spring

    669questions

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

  • JUnit

    177questions

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