【问题标题】:Can an abstract class be mocked using mockito?可以使用 mockito 模拟抽象类吗?
【发布时间】:2015-04-29 23:37:11
【问题描述】:

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

public abstract AbstractClass{
} 

//Class under test
public class SourceClass{            
  SourceClass(AbstractClass abstractClass){}            
}

@RunWith(MockitoJUnitRunner.class
public SourceClassTest{
 @Mock
  AbstractClass abstractClass;
}

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

java.lang.ExceptionInInitializerError

我正在使用的另一个版本的 mockito 我 1.8.5

【问题讨论】:

标签: unit-testing junit mocking mockito abstract-class


【解决方案1】:

好吧,下面这段代码运行良好,只要告诉我是否需要添加一些 cmets 来解释我写的内容,好吗? (嘿,我正在使用 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);
    }
}

【讨论】:

  • 如果您对此表示反对,您至少可以解释一下原因吗?它没有对所问的问题提供明确的答案吗?
【解决方案2】:

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

【讨论】:

  • 嗯...您应该将其添加为答案:)
  • 这也可以(甚至比添加答案更好):)
猜你喜欢
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多