あなたはこの
public class TestMe {
public void doSomething() {
try {
f = createStream()
f.read(buffer);
} finally {
if (f != null)
try {
f.close();
} catch (IOException ignored) { }
}
}
public InputStream createStream() {
return new BufferedInputStream(new FileInputStream(source));
}
}
そして今、あなたは、入力ストリームクラスをキャプチャし、それが閉じているを確認するためにテストを書くことができるようなものにはほとんど
public class TestMe {
public void doSomething() {
try {
f = new BufferedInputStream(new FileInputStream(source));
f.read(buffer);
} finally {
if (f != null)
try {
f.close();
} catch (IOException ignored) { }
}
}
}
コードをリファクタリングできます。 (コードは大まかですが、うまくいけば一般的な考えを得ることができます)。
public void TestSomething() {
InputStream foo = mock(InputStream.class); // mock object
TestMe testMe = new TestMe() {
@Override
public InputStream createStream() {
return foo;
}
}
testMe.something();
verify(foo.close());
}
これは価値があるかどうかは別の質問ですか?今では硬くなり
try {
f = new BufferedInputStream(new FileInputStream(source));
f.read(buffer);
} finally {
IOUtils.closeQuietly(f);
}
:
私は同意します。私は、テストでメソッドをオーバーライドするという選択肢は非常に便利ですが、それはしばしば合成を選択する途中のステップです。 C#はその点でPITAです。メソッドはデフォルトでは仮想ではないので、私はしばしば全体を飛び越えなければならないことがわかります(できるだけ小さな変更で作業したいので面倒です)。 –
ありがとうございました。まさに私が探していたものです:) Jeffにも感謝します。 – fyr