可以使用 mockito 模拟抽象类吗?



在一个被测试的类中,如果它的构造函数接受一个抽象的类参数,我们可以用mockito来模拟它吗?

前任

public abstract AbstractClass{
} 
//Class under test
public class SourceClass{            
  SourceClass(AbstractClass abstractClass){}            
}
@RunWith(MockitoJUnitRunner.class
public SourceClassTest{
 @Mock
  AbstractClass abstractClass;
}

每当我这样做时,我都会收到此错误

java.lang.ExceptionInInitializerError

我正在使用的模拟版本 i 1.8.5

好吧,下面的代码工作正常,只需告诉我是否需要添加一些注释来解释我写的内容,好吗?(嘿,我正在使用 Mockito 1.10.8):

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
abstract class AbstractClassToTest {
    public abstract String doSomething();
}
class ConcreteClass {
    private String something;
    public ConcreteClass(AbstractClassToTest aClass){
        this.something = aClass.doSomething();
    }
    public String getSomething(){
        return this.something;
    }
}
@RunWith(MockitoJUnitRunner.class)
public class TempTest {
    @Mock
    private AbstractClassToTest myClass;
    @Test
    public void canAbstractClassToTestBeMocked() {
        String expectedResult = "hello world!";
        Mockito
            .when(myClass.doSomething())
            .thenReturn(expectedResult);
        String actualResult = myClass.doSomething();
        Assert.assertEquals(expectedResult, actualResult);
    }
    @Test
    public void canConcreteClassBeInstantiatedWithMock() {
        String expectedResult = "hello world!";
        Mockito
            .when(myClass.doSomething())
            .thenReturn(expectedResult);
        ConcreteClass concrete = new ConcreteClass(myClass);
        String actualResult = concrete.getSomething();
        Assert.assertEquals(expectedResult, actualResult);
    }
}

你不能模拟抽象类,你必须模拟一个具体的类并传递它。就像常规代码不能实例化抽象类一样。

相关内容

  • 没有找到相关文章

最新更新