5

次のようなコードをテストするためのモックオブジェクトを作成するにはどうすればよいか疑問に思っています。

public class MyTest
{
  private A a;
  public MyTest()
  {
     a=new A(100,101);
  }
}

ありがとう

4

3 に答える 3

10

直接を使用してオブジェクトをインスタンス化するコードnewは、テストを困難にします。ファクトリパターンを使用することにより、オブジェクトの作成をテストするコードの外に移動します。これにより、モックオブジェクトやモックファクトリを注入する場所が提供されます。

MyTestテストするクラスとしての選択は、名前がテスト自体であることを示しているため、少し残念なことに注意してください。に変更しますMyClass。また、コンストラクターでオブジェクトを作成することは、インスタンスを渡すことで簡単に置き換えることができるAので、後で呼び出されるメソッドに作成を移動します。

public interface AFactory
{
    public A create(int x, int y);
}

public class MyClass
{
    private final AFactory aFactory;

    public MyClass(AFactory aFactory) {
        this.aFactory = aFactory;
    }

    public void doSomething() {
        A a = aFactory.create(100, 101);
        // do something with the A ...
    }
}

Aこれで、モックまたは任意のモックを作成するテストでモックファクトリに合格できAます。Mockitoを使用してモックファクトリを作成しましょう。

public class MyClassTest
{
    @Test
    public void doSomething() {
        A a = mock(A.class);
        // set expectations for A ...
        AFactory aFactory = mock(AFactory.class);
        when(aFactory.create(100, 101)).thenReturn(a);
        MyClass fixture = new MyClass(aFactory);
        fixture.doSomething();
        // make assertions ...
    }
}
于 2012-11-28T03:34:29.457 に答える
3

mckingフレームワークを使用しmockitoて、次のようなものを試してください。

   whenNew(MyTest.class)
     .withArguments(Mockito.anyInt(), Mockito.anyInt())
     .thenReturn(new MockedMyTest(param1, param2));
于 2012-11-28T03:32:09.587 に答える
2

インターフェイスIaを使用します。それで。

Class A implements Ia;
Class MockA implements Ia;
private Ia a;

それで

public MyMockTest {
a = new MockA(100, 100);
int result = a.doWork();
assertEquals(200, result);
 // asuming doWork would add both constructor parameters
}
于 2012-11-28T03:38:36.643 に答える