2

重複の可能性:
Mockito を使用して抽象クラスをテストする

テストする必要がある機能を備えた抽象クラスがあります。抽象メソッドの op 実装を使用せずにそのクラスの単純な派生物を作成できますが、フレームワークのモックで行うことは可能ですか? クラスの内部状態を維持する必要があるため、単に呼び出すことはできません

mockedInstance = mock(ClassUnderTest.class);

私には何か必要です

mockedInstance = spy(new ClassUnderTest(...));

しかし、クラスは抽象であるため、明らかにこれは不可能です。

4

2 に答える 2

2

モックしない抽象クラスを単体テストする場合は、サブクラス化します。

他の回答で mijer からコードを借りる

public class MockitoTest {
    public static abstract class MyAbstractClass {
       private int state;
       public abstract int abstractMethod();

       public int method(....)
       {
        ...
       }
    }
}


class Testclass extends MyAbstractClass 
{
      public int abstractMethod()
      {
       ...
      }
 }

次に、Testclass のインスタンスを使用して MyAbstractClass のテストを実行します。ローカル サブクラスで抽象メソッドの実装を制御できます。

于 2011-11-17T19:04:56.600 に答える
1
import org.junit.Test;
import org.mockito.internal.stubbing.answers.CallsRealMethods;

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;

public class MockitoTest {
    public static abstract class MyAbstractClass {
        private int state;
        public abstract int abstractMethod();
        public void method() {
            System.out.println("method. State: " + (++state));
            System.out.println("abstractMethod: " + abstractMethod());
            anotherMethod();
        }
        public void anotherMethod() {
            System.out.println("anotherMethod. State: " + (++state));
        }
    }

    @Test
    public void test() throws Exception {
        MyAbstractClass obj = mock(MyAbstractClass.class, new CallsRealMethods());
        doReturn(5).when(obj).abstractMethod();

        obj.method();

        verify(obj).abstractMethod();

        assertEquals(2, obj.state);
    }
}

-編集-

  1. オブジェクトの内部状態を維持する必要がある場合は、次のように使用する必要がありますorg.mockito.internal.util.reflection.Whitebox.setInternalState

    @Test
    public void test() throws Exception {
        MyAbstractClass obj = mock(MyAbstractClass.class, new CallsRealMethods());
        setInternalState(obj, "state", 100);
        doReturn(5).when(obj).abstractMethod();
    
        obj.method();
    
        verify(obj).abstractMethod();
        assertEquals(102, obj.state);
    }
    
  2. テストしたいコンストラクターに複雑なロジックを持つ抽象クラスがある場合は、テストするためだけにこのクラスを拡張するか、クラスをリファクタリングして、すべてのロジックをテストするメソッドに移動する必要があります。

于 2011-11-17T17:24:07.653 に答える