私は次のコードを持っています:
Collection<String> errors = ...;
try (InputStream stream = My.class.getResourceAsStream(resource)) {
// do stuff
}
catch(IOException ex) {
errors.add("Fail");
}
私が与える(有効な)入力ストリームが閉じていると思われるときに、Byteman Junit RunnerでIOExceptionをトリガーしようとしています:
@RunWith(BMUnitRunner.class)
public class MyTest {
private My my = new My();
@BMRule(
name = "force_read_error",
targetClass = "java.io.InputStream",
targetMethod = "close()",
action = "throw new IOException(\"bazinga\")"
)
@Test
public void catches_read_error() throws IOException {
Collection<String> errors = my.foo("/valid-resource-in-classpath");
assertThat(errors).containsExactly("Fail");
}
}
私のテストは失敗します: エラーは常に空です。これは明らかに Byteman ルールが実行されていないことを意味します (エージェントによって十分にロードされているため、何が起こっているのかわかりません)。
try-with-resources を介して呼び出された close メソッドで IOException をトリガーするにはどうすればよいですか?