嘲笑抽象类



可能重复:
使用Mockito测试抽象类

我有一个抽象类,其中包含我需要测试的功能。我可以创建该类的简单派生,而不需要抽象方法的操作实现,但有可能使用mocking框架吗?我需要维护类的内部状态,所以我不能只调用

mockedInstance = mock(ClassUnderTest.class);

我需要

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

但显然这是不可能做到的,因为类是抽象的。

当我想单元测试一个我不模拟的抽象类时,我会给它子类。

在其他应答中从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的测试。您可以控制本地子类中抽象方法的实现。

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. 如果你有一个抽象类,它的构造函数中有一个复杂的逻辑,你想测试它,你应该扩展这个类,只是为了测试或重构你的类,把所有的逻辑转移到某个要测试的方法。

相关内容

  • 没有找到相关文章

最新更新