次のようなコードをテストするためのモックオブジェクトを作成するにはどうすればよいか疑問に思っています。
public class MyTest
{
private A a;
public MyTest()
{
a=new A(100,101);
}
}
?
ありがとう
次のようなコードをテストするためのモックオブジェクトを作成するにはどうすればよいか疑問に思っています。
public class MyTest
{
private A a;
public MyTest()
{
a=new A(100,101);
}
}
?
ありがとう
直接を使用してオブジェクトをインスタンス化するコード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 ...
}
}
mckingフレームワークを使用しmockito
て、次のようなものを試してください。
whenNew(MyTest.class)
.withArguments(Mockito.anyInt(), Mockito.anyInt())
.thenReturn(new MockedMyTest(param1, param2));
インターフェイス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
}