2

「テンプレート メソッド」パターンに従うクラスがいくつかあります。抽象クラス 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
4

2 に答える 2

2

あなたの問題は addMockedMethod(String) の使用かもしれないと思います。オーバーロードがない場合、EasyMock があいまいなメソッド名について不平を言っている理由がわかりません。しかし、以下は私のために働いた:

@Test
        public void testSomethingOrAnother() {
            B target = null;
            try {
                target = EasyMock.createMockBuilder(B.class).addMockedMethod(B.class.getDeclaredMethod("getData")).createMock();
                EasyMock.expect(target.getData()).andThrow(new SomeException());
                EasyMock.replay(target);
            } catch (NoSuchMethodException e) {
                fail(e.getMessage());
            } catch (SomeException e) {
                fail(e.getMessage());
            }

            try {
                target.doWork();
                fail("doWork should have thrown an exception");
            } catch (OtherException e) {
                //pass
            }
        }
于 2013-05-24T20:47:09.683 に答える
0

Easymock:3.2 では、メソッドのパラメーターの型を指定できます。ご覧くださいIMockBuilder#addMockedMethod(String methodName,Class<?>... parameterTypes) ありがとうございます。

于 2014-11-07T12:30:29.027 に答える