「テンプレート メソッド」パターンに従うクラスがいくつかあります。抽象クラス A、具象拡張 B および C。次のようになります。
public abstract class A
{
protected abstract String getData() throws SomeException;
public void doWork() throws OtherException
{
try
{
// business logic ...
String data = this.getData();
// more business logic ...
}
catch(SomeException e)
{
log("...", e);
throw new OtherException("...", e);
}
}
}
public Class B extends A
{
protected String getData() throws SomeException
{
// complicated logic relying on lots of dependencies
}
}
public Class C extends A
{
protected String getData() throws SomeException
{
// different but equally complicated logic relying on lots of dependencies
}
}
getData() が SomeException をスローしたときに OtherException がスローされたことを確認するテストを作成したいと考えています。getData() を強制的にスローするために必要なすべての複雑な依存関係をモックアップすることは避けたいと思っています。getData() がどのようにスローされるかは気にしません。スローしたいだけです。したがって、部分的なモックが必要だと思います。これは私が持っているものです:
import static org.easymock.EasyMock.*;
....
@Test(expected = OtherException.class)
public void testSomethingOrAnother() throws Exception
{
B target = createMockBuilder(B.class).addMockedMethod("getData").createMock();
expect(target.getData()).andThrow(SomeException.class).once();
replay(target)
try
{
target.doWork(); // expect this to throw OtherException;
}
finally
{
verify(target);
}
}
テストは私には良さそうに見えますが、実行すると次のようになります。
java.lang.Exception: Unexpected exception, expected<OtherException> but was<java.lang.RuntimeException>
... deleted for brevity ...
Caused by: java.lang.RuntimeException: Ambiguous name: More than one method are named getData
at org.easymock.internal.ReflectionUtils.findMethod(ReflectionUtils.java:96)
at org.easymock.internal.ReflectionUtils.findMethod(ReflectionUtils.java:64)
at org.easymock.internal.MockBuilder.addMockedMethod(MockBuilder.java:73)
at org.easymock.internal.MockBuilder.addMockedMethods(MockBuilder.java:92)
at com.mycompany.more.packages.BTest(BTest.java:83)
... deleted for brevity ...
... 16 more
明確にするために、階層内のどこにも getData() メソッドのオーバーロードはありません。
EasyMock は私がここでやろうとしていることを実行できますか? 私は何が欠けていますか?
関連するバージョン番号:
- イージーモック 3.0
- JUnit 4.4
- Java 1.6