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

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

ただいまの
回答率

87.61%

junitでNullPointExceptionが発生してしまう

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,650

score 15

前提・実現したいこと

初めて、junitを活用して、テストをしています。
STS,pgadmin3とdbfluteを使用して
ローカルにあるデータベースからデータを取ってくるプログラムを作っています。

どのようにすればExceptionが発生しなくなるのでしょうか?

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

プログラムを作ったので、junitでテストをすると
NullPointExceptionが出てしまい、データを取得出来ません。
(発生箇所:ComeOn.java のコメント部分)

該当のソースコード

*都合上一部省略しているところ、名前を変更しているところがあります。
↓ソースコード1
ComeOn.java

package (src/main/java内の任意のパッケージ);

import (略).ServerException;
import (略).ServletFactory;
import (略).MngService;
import org.springframework.stereotype.Service;

@Service
public class test{

    MngService MngService;

    public test() throws ServerException, IOException {
        try {
            ServletFactory.setup();
        } catch (ServerException | IOException e) {
            throw e;
        }
    }

    public void execute() {
        // IDを基にマスタより事前に追加したレコードを取得
        final String Id = 1;
        Mng Info = MngService.getMng(Id);      //ここでNullPointExceptionが発生
        if (Info == null ) {
            return;
        }
    }
}

↓ソースコード2(junitでテストするコード)
ComeOnTest.java
※assertionを使っていませんがそれ以前の問題になっています。

package (src/test/java/(ComeOnTest.javaが格納されているパッケージと同名));

import static org.junit.Assert.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.thymeleaf.util.StringUtils;

import (略).MngBhv;
import (略).Mng;
import (略).BaseSpringTest;
import (略).MngService;

public class ComeOnTest extends BaseSpringTest {


    @Autowired
    MngService mngService;

    @Autowired
    MngBhv mngBhv;


    @Test
    public void testExecute() throws Exception {
        {
            //対象のDBへのレコード追加(事前準備)
            Mng recode = new Mng();
            recode.setId("1");
            recode.setTargetDate(20190122095059L);
            mngBhv.insert(recode);
        }

        ComeOn comeOn = new ComeOn();
        comeOn.execute();

    }
}

↓ソースコード3(Exception発生部分のもとのコード)
MngService.java

package (ComeOn.javaと同一パッケージ).service;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import (略).dbflute.exbhv.MngBhv;
import (略).dbflute.exentity.Mng;

@Scope("prototype")
@Service
public class MngService {

    @Autowired
    private MngBhv mngBhv;

    /**
     * 主キー(バッチID)に該当するレコードを返却する
     * @param Id ID
     * @return 主キーに一致するレコード
     */
    public Mng getMng(String Id) {
        if (StringUtils.isBlank(Id)) {
            throw new IllegalArgumentException(String.format("IDが不正です。));
        }
        return mngBhv.selectByPKValue(Id);
    }
}

試したこと

  • pgadminの方には、準備したデータが作成されていました。
  • 強引ですが、試しにComeonTest.javaのtestExecute()内にComeon.javaのexcute()内の処理を書き、
    ComeOn.javaのexcute()内の処理をコメントアウトして実行したところExceptionが発生しませんでした。

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

すみません、インストールしたときのファイル名を記載します。
pgadmin:3-1.22.1
sts:2.1.2.5
vagrant:1.9.3

いくつか類似質問を見たのですが理解できずいてる次第です。。。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

テストクラスが継承しているクラスの実装がないので明確な回答にはならないかもしれませんが、
MngService のインスタンスを取得していないのでnullになります。

テスト実行する際にはSpringのBean定義からServiceクラスを取得するのか、それともモッククラスから取得するのかしなければ動作しません。

継承しているクラスを実装された方が正しい実装方法を知っているかと思いますが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/23 11:58

    シングルトンについて調べてみたのですが、まだ理解ができませんでした。
    いくつか質問させてください。(見当違いであればすみません)
    1.MngServiceのインスタンスの取得をするところは、ComeOn.javaのクラス内かつメソッドの外ということでしょうか?
     (ComeOn.javaの"MngService MngService;"となっているところを"MngService MngService=new
    MngService();"と直す)
    2.質問1のようにしたとき、MngService.javaには、コンストラクタがない状況です。
      コンストラクタの作成も必要でしょうか?

    キャンセル

  • 2019/01/24 11:29

    インスタンスを取得したら解決しました。
    しかし、継承しているクラスでも同じようにNullPointExceptionが発生したので、
    A-pzさんのおっしゃるとおり、手間はかかりますが、継承しているクラスを実装していこうと思います。

    ご回答いただき、ありがとうございました。大変助かりました。

    キャンセル

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

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

関連した質問

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