Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

privateメソッド内のファイルクローズメソッドのデバックについて

privateメソッド内のファイルクローズ時に発生するExceptionのテストを実施したいのですが、Exceptionが発生できません。
サンプルソースなどがありましたら教えていただけないでしょうか?

11

回答

3788

閲覧

11件の回答

評価

0

デバッ「グ」ね。
バクを除くのではなくバグを除くんだ。

それで、UT時だと思うが、closeでExceptionを出すために自
分では何を調べて何を試したんだ?

評価

0

ご指摘ありがとうございました。
タイプミスをしてしまいました。

Mockなどを使用して意図的にExceptionをthrowするようにしたのですが、throwされません。

評価

0

対象のソースです。

・テストクラス
    public void testcloseFile14() throws Exception{
         String methodName = "getSyoyoList";
         Class[] classes = {String.class};
         Object[] objects = {FILE_DIR};
         File file = new File(FILE_DIR + FILE_NAME);

         BufferedReader reader = mock(BufferedReader.class);
         doThrow(new IOException()).when(reader).close();

         try {
             invoke(methodName, classes, objects);
             fail("エラーが発生しない");
         } catch (Throwable e) {
             e.printStackTrace();
         }
     }
     
・テスト対象メソッド
     private List<String> getSyoyoList(String filePath) throws ServiceException {

        String fileFullPath = filePath + fileName;
        File file = new File(fileFullPath);

        List<String> result = new ArrayList<String>();
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(file));

            // ファイルからデータを1行ずつ読み込む
            while (true) {
                String line = reader.readLine();
                if (line == null) {
                    break;
                }
                result.add(line);
            }
        } catch (IOException e) {
            throw new ServiceException(e, "TEST");
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    throw new BServiceException(e, "クローズエラー");
                }
            }
        }
        return result;
    }

評価

0

そのモックは使ったことないけど、doThrowで渡してるイン
スタンスと、実際に使ってるインスタンスが別ものだからじ
ゃないの。

評価

0

回答ありがとうございます。
素人で申し訳ありません。

dothrowで渡しているインスタンスと別ものだからと言うことで
すが型が同じだと認識してくれないということでしょうか?
それはテスト対象のインスタンスと同じでないとダメなのでしょ
うか?

すみませんが宜しくお願いします。

評価

0

>型が同じ
モックの機能を誤解していると思われる。
モックは指定した型を書き換えるツールではない。
指定した型の継承クラスを動的に生成して、期待する振る舞
いをさせるツールだ。

継承クラスを生成するタイミングはそのライブラリによる。
恐らくそのライブラリは、mock()を呼び出したタイミングで
生成し、返却するのだろう。
サンプルコードくらいあるだろう。
モックオブジェクトはその戻り値として受け取ったインスタ
ンスだけだ。

クラスローダに自前のものを使うことにより、newのタイミ
ングで継承クラスを生成するタイプのものでないと、期待し
ている挙動をさせることはできない。

元々のクラス自体の構造を変え、例えばプロパティで指定し
たReaderクラスをリフレクションで生成するなら、試験の時
だけダミークラスを使うことができる。

評価

0

クラスローダを使うものだと、BufferedReaderという継承ク
ラスではなく、close()メソッドを定義しているクラスに対し
てモックを仕掛けないといけなかったりするが、恐らく今回
のは違うだろう。

評価

0

今のままのロジックでは実施は不可能なのでしょうか?

評価

0

得られた回答から、自分で考えることはしないのか?

評価

0

考えた結果で質問しておりますが。

評価

10

「考えた」だけなら誰でもいえるだろう。
実際に何を考えて、追加で何を調べて、何を試して、その結
果どうだったんだ。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。