Mockito:模仿类总是称为真正的方法

时间:2017-08-24 12:48:16

标签: java unit-testing mockito

我想嘲笑一个班级。

这个类的调用方式如下:

这是我的代码:

@Mock
SomeClass someClass;

@InjectMocks
ToBeTested toBeTested;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

// in the test:
doReturn(returnValue).when(someClass).doSomething(param1, param2); 

我觉得我已尝试过@Mock@Spy以及doReturnwhen的所有可能组合,但不是模拟方法调用,而是调用真正的方法并抛出一个NPE。

我该如何正确地做到这一点?

如果需要,我会提供更多代码。

修改

SomeClassdoSomething()都是公开的,都不是最终的。

我尝试使用MockitoJunitRunnerclass代替MockitoAnnotations,但仍然会抛出异常。

要测试的课程:

@Component
public class ToBeTested implements Something {

    @Override
    public ReturnValue doSomeAction(Parameter theParam) {
        try {
            SomeClass theClass = new SomeClass();
            MyReturnValue myReturnValue = theClass.doSomething(
                    parameterOfTypeInputStream,
                    parameterOfTypeString
            );

        // other stuff

            return theParam;
        } catch (IOException e) {
            throw new RuntimeException("Oh no!");
        }
    }

// more

param1param2分别是InputStream和String类型。

1 个答案:

答案 0 :(得分:2)

当然它没有被嘲笑,实际的代码在方法doSomeAction中创建了真正的类,以便注入的模拟SomeClass theClass应该是一个字段。

@Component
public class ToBeTested implements Something {
    SomeClass theClass;

    @Autowired
    public ToBeTested(SomeClass theClass) {
        this.theClass = theClass;
    }    

    @Override
    public ReturnValue doSomeAction(Parameter theParam) {
        try {
            MyReturnValue myReturnValue = theClass.doSomething(
                    parameterOfTypeInputStream,
                    parameterOfTypeString
            );

        // other stuff

            return theParam;
        } catch (IOException e) {
            throw new RuntimeException("Oh no!");
        }
    }

您的应用程序容器(Spring)应该创建bean SomeClass并注入它,因为此构造函数由@Autowired注释。

由于Mockito的@InjectMocks注释将查找构造函数,它将找到此构造函数并注入您在测试类(@Mock SomeClass someClass;)中声明的模拟。