0
privateメソッド内のファイルクローズメソッドのデバックについて
privateメソッド内のファイルクローズ時に発生するExceptionのテストを実施したいのですが、Exceptionが発生できません。
サンプルソースなどがありましたら教えていただけないでしょうか?
0
privateメソッド内のファイルクローズ時に発生するExceptionのテストを実施したいのですが、Exceptionが発生できません。
サンプルソースなどがありましたら教えていただけないでしょうか?
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ヶ月以上経過しているので、回答を書き込むことはできません。