我想嘲笑一个班级。
这个类的调用方式如下:
这是我的代码:
@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
以及doReturn
和when
的所有可能组合,但不是模拟方法调用,而是调用真正的方法并抛出一个NPE。
我该如何正确地做到这一点?
如果需要,我会提供更多代码。
修改
SomeClass
和doSomething()
都是公开的,都不是最终的。
我尝试使用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
param1
和param2
分别是InputStream和String类型。
答案 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;
)中声明的模拟。