JMockit学習のmockインタフェース


大規模なソフトウェアプロジェクトでは、設計時にモジュール化された区分が行われ、モジュール間に依存関係があることが多い.各モジュール間の結合を低減するために,インタフェースにより依存し,各モジュールは異なる開発グループによって並列開発される.AモジュールがBモジュールのインタフェースを使用する必要がある場合、Bモジュールは開発の進度が遅いため、対応する実装クラスの開発が完了していない.では、このときAがユニットテストを行うのは難しいです.Aが独自のモジュール機能をテストする必要がある場合は、Bのインタフェースをmockする必要があります.次にjmockitがどのようにmockインタフェースをmockするかを紹介します.
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メソッドを使用できます.