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

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

ただいまの
回答率

88.92%

Springの@Autowiredの使い方

解決済

回答 2

投稿

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

TAKAO-WATANUKI

score 14

初めましてでは無いのですが、前のIDが消えてしまったので改めてお願いいたします。
現在、SpringやCXF等を使用してWebサービスの開発をしております。

前提・実現したいこと

JUnitのテストクラスにサービスを@Autowiredでインスタンス化したい。

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

java.lang.NullPointerException
    at jp.co.aaa.bbb.test.AaaServiceTest.test001(AaaServiceTestServiceTest.java:90)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    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:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

該当のソースコード

package jp.co.aaa.bbb.test;

import static org.junit.Assert.*;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.commons.text.RandomStringGenerator;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import jp.co.aaa.common.ServiceException;
import jp.co.aaa.bbb.constants.bbbConstants;
import jp.co.aaa.bbb.dto.ReceivePaymentRequestDTO;
import jp.co.aaa.bbb.dto.AaaDTO;
import jp.co.aaa.bbb.service.AaaService;
import jp.co.aaa.bbb.service.impl.AaaServiceImpl;

public class AaaServiceTest {

  @Autowired
  private AaaService service;

//  private static AaaService service = new AaaServiceImpl();
  private ResourceBundle pp = ResourceBundle.getBundle("bbb");
  private AaaDTO res = new AaaDTO();
  private AaaRequestDTO req = new AaaRequestDTO();
  private static SimpleDateFormat postedDateTimeFormat = new SimpleDateFormat("EEE, d MMM yyyy kk:mm:ss z",
      Locale.ENGLISH);
  private String accessToken = null;
  private String messageSeqNo = null;

  @Before
  public void init() {
    Date currentDateTime = new Date();

    this.accessToken = new RandomStringGenerator.Builder()
        .withinRange('0', 'z')
        .filteredBy(Character::isLetterOrDigit)
        .build()
        .generate(36);

    this.messageSeqNo = new RandomStringGenerator.Builder()
        .withinRange('0', '9')
        .filteredBy(Character::isLetterOrDigit)
        .build()
        .generate(36);

//    req.setMessageKind(BbbConstants.MESSEGE_RP);
    req.setMessageSeqNo(messageSeqNo);
    req.setAud("AUD001");
    req.setJti("JTI001");
    req.setIat("IAT001");
    req.setJwtExp("3600000");
    req.setPostedDate(postedDateTimeFormat.format(currentDateTime));
    req.setAccessToken(accessToken);
    req.setAccessTokenExp(pp.getString("bbbExpiresIn"));
//    req.setAccessTokenScope(pp.getString("bbbScope"));
//    req.setRemReqDay("2019/06/14");
//    req.setRemProcSeqNo("00000000001");
//    req.setReqCount("1");
//    req.setResCount("1");
//    req.setResndFlg("0");
    req.setHttpStatusCd(BbbConstants.HTTP_STATUS_CD_SUCCESS);
    req.setErrorCode("00");
    req.setError("000");
    req.setRemProcSeqNo("1234567890");
    req.setAtmNo("001");
    req.setAtmProcSeqNo("0000000001");
    req.setAtmUseDate("2019/06/14");
    req.setBillProc("1");
    req.setBillProcRslt(BbbConstants.RESPONSE_SUCCESS);
    req.setBillPytl("100000");
    req.setCoinProc("0");
    req.setCoinPytl("0");
    req.setCoinProcRslt(BbbConstants.RESPONSE_SUCCESS);

  }

  @Test
  public void test001() {
    this.accessToken = "69ubXK04kKnSCAuwPjs5zKNKLtbluvKuzYNh";
    req.setAccessToken(accessToken);
    System.out.println("----- AaaService test-001 Start -----");
    System.out.println("#AccessToken = " + accessToken + " #");
    System.out.println("#MessageSeqNo = " + messageSeqNo + " #");
    try {
      res = ((AaaServiceImpl)service).invoke(req);
      assertEquals(bbbConstants.HTTP_STATUS_CD_SUCCESS, res.getResult());
    } catch (ServiceException e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    }
    System.out.println("----- AaaService test-001 End   -----");

  }

}

試したこと

@Autowiredでインスタンス化出来なかったので止む終えず下記のコードで代用しました(ソースの上方のコメントアウト)。
private static AaaService service = new AaaServiceImpl();

取りあえずインスタンスは生成出来るのでテストは出来るのですが、Springを使っていく上で今後障害になるとおもわれるので正しい方法を知りたいです。
現状、無理やりなのでよろしくないと思っています。
どなたかお詳しい方のアドバイスをご教示いただければ幸いです。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2019/06/16 14:44

    テストケースのサンプルは スタータープロジェクト作成でできてたと思いますがそれがどういう構成かを理解・調査しましたか?

    キャンセル

回答 2

checkベストアンサー

+1

Spring + JUnit4でSpring管理下Beanを使ったテストを作る場合は、例えば、

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:testContext.xml"})


など、Spring用の設定が追加で必要です。

ここなどが参考になるでしょうか。
http://javatechnology.net/spring/runwith-junit/

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/21 13:54

    お返事が遅くなり、申し訳ありません。javaの経験はそれなりにあるのですが、Springの経験が浅く、理解が追いついていない状況であります。
    @ContextConfiguration(locations = {"classpath:testContext.xml"})
    この部分の"testContext.xmlには何を記述したら良いのでしょうか?
    的外れな質問で申し訳ありません。

    キャンセル

  • 2019/06/21 14:02

    テスト環境用(ない場合は実行環境で利用している)Springの設定ファイルです。applicationContext.xmlなどの名前が一般的です。SpringBootで作られていなければ設定ファイルがあるはずです。

    キャンセル

-1

インジェクションされる側のAaaServiceは、DIコンテナにあるのですか?

アノテーションをつけ忘れていたり、コンポーネントスキャンされないパッケージにいたりしていませんか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/21 13:56

    お返事が遅れて申し訳ありません。
    インジェクションされる側と言うのは相手クラスの事を指すのでしょうか?
    何分Springの経験が浅く、初心者レベルから脱却出来ていない状況です。

    キャンセル

  • 2019/06/21 14:06

    依存性を解決するために、DIコンテナに必要とするコンポーネントを取り込んで、インスタンス取得時に、必要なものをくっ付けて返すような仕組みなので、DIコンテナに取り込むべき対象に、@Component とか@Service などの印を付けて、スキャンをしています。

    今回は多分、他の回答にある、RunWithの設定が問題箇所かと思います。

    それが、コンテナを作りコンポーネントを取り込んでから試験してくださいという、印なので。

    キャンセル

  • 2019/06/21 14:08

    context.xml には、個別に取り込むコンポーネントを書きますが、コンポーネントスキャンに任せる設定だけでも良いと思います。

    コンポーネントスキャンは、スキャン対象のパッケージを設定します。

    キャンセル

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

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

関連した質問

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