JMockit学習のmockインタフェース
3147 ワード
大規模なソフトウェアプロジェクトでは、設計時にモジュール化された区分が行われ、モジュール間に依存関係があることが多い.各モジュール間の結合を低減するために,インタフェースにより依存し,各モジュールは異なる開発グループによって並列開発される.AモジュールがBモジュールのインタフェースを使用する必要がある場合、Bモジュールは開発の進度が遅いため、対応する実装クラスの開発が完了していない.では、このときAがユニットテストを行うのは難しいです.Aが独自のモジュール機能をテストする必要がある場合は、Bのインタフェースをmockする必要があります.次にjmockitがどのようにmockインタフェースをmockするかを紹介します.
次はユニットテストです
テストにより、以下の結論が得られました.
1、ターゲットインタフェースに複数の方法が存在する場合、私たちは自分のmockを必要とする方法に注目するだけでよい.不要な方法に対して、jmockitはデフォルトの実現を提案し、インタフェースのすべての方法を実現する必要はない.
2、MockUpのmockの方法は必ず対応するインタフェースの方法と署名しなければならない.そうしないとjavaを間違えてしまう.lang.IllegalArgumentException: Matching real methods not found for the following mocks
3、MockUpの方法は必ず@Mock注釈を付けなければならない.そうしないとjmockitに無視され、mockの目的を達成できない.
JAvaには抽象クラスもあり、インタフェースと同じ方法でmockを行うと、エラーが見つかります
Javaのinterfaceであれば、mockのgetMockInstanceメソッドを使用できます.
public interface InterfaceToMock
{
public String method1();
public int method2();
}
次はユニットテストです
public class InterfaceToMockTest
{
@Test
public void test1()
{
InterfaceToMock mockInstance = new MockUp<InterfaceToMock>()
{
@Mock
public String method1()
{
return "beMocked";
}
}.getMockInstance();
Assert.assertNotNull(mockInstance);
Assert.assertEquals("beMocked", mockInstance.method1());
Assert.assertEquals(0, mockInstance.method2());
}
@Test
public void test2()
{
InterfaceToMock mockInstance = new MockUp<InterfaceToMock>()
{
// @Mock , jmockit ;
// , jmockit
public String method1()
{
return "beMocked";
}
}.getMockInstance();
Assert.assertNotNull(mockInstance);
Assert.assertEquals(null, mockInstance.method1());
}
}
テストにより、以下の結論が得られました.
1、ターゲットインタフェースに複数の方法が存在する場合、私たちは自分のmockを必要とする方法に注目するだけでよい.不要な方法に対して、jmockitはデフォルトの実現を提案し、インタフェースのすべての方法を実現する必要はない.
2、MockUpのmockの方法は必ず対応するインタフェースの方法と署名しなければならない.そうしないとjavaを間違えてしまう.lang.IllegalArgumentException: Matching real methods not found for the following mocks
3、MockUpの方法は必ず@Mock注釈を付けなければならない.そうしないとjmockitに無視され、mockの目的を達成できない.
JAvaには抽象クラスもあり、インタフェースと同じ方法でmockを行うと、エラーが見つかります
public abstract class AbstractClass
{
public abstract String returnTargerValue();
public static String staticMethod()
{
return "staticMethod";
}
public String instanceMethod()
{
return "instanceMethod";
}
}
public class AbstractClassTest
{
@Test
public void tesGetMockInstance1()
{
AbstractClass mockInstance = new MockUp<AbstractClass>()
{
@Mock
public String instanceMethod()
{
return "beMocked";
}
}.getMockInstance();
Assert.assertNull(mockInstance);
}
@Test
// mock
public void tesGetMockInstance2()
{
AbstractClass mockInstance = new MockUp<AbstractClass>()
{
@Mock
public String returnTargerValue()
{
return "beMocked";
}
}.getMockInstance();
// java.lang.IllegalArgumentException: Attempted to mock abstract
// method "returnTargerValue"
}
}
Javaのinterfaceであれば、mockのgetMockInstanceメソッドを使用できます.