我使用mockito作为模拟框架。我有一个scenerio,我的时间(abc.method())。thenReturn(value)不返回值,而是返回null。
public class DQExecWorkflowServiceImplTest {
@InjectMocks
DQExecWorkflowServiceImpl dqExecWorkflowServiceImpl = new DQExecWorkflowServiceImpl();
@Mock
private DQUtility dqUtility;
@Mock
private DqExec dqExec;
@Mock
private DqCntlDefn dqCntlDefn;
@Mock
private DqCntlWfDefn dqCntlWfDefn;
@Mock
private DqCntlWfDefnTyp dqCntlWfDefnTyp;
@Mock
private IDQControlWfDefTypeService controlWfDefTypeService;
@Before
public void setUp() throws Exception {
dqExec = new DqExec();
dqCntlWfDefn = new DqCntlWfDefn();
dqUtility = new DQUtility();
dqCntlWfDefnTyp = new DqCntlWfDefnTyp();
dqCntlWfDefnTyp.setDqCntlWfDefnTypCd("MIN_INCLUSIVE_VAL");
dqExecWorkflowServiceImpl
.setControlWfDefTypeService(controlWfDefTypeService);
}
@Test
public void testExecuteWorkflow() {
when(controlWfDefTypeService.getDqCntlWfDefnTypCd(dqCntlWfDefn))
.thenReturn(dqCntlWfDefnTyp);
dqExecWorkflowServiceImpl.executeWorkflow(dqExec, dqCntlWfDefn);
}
}
Java类
@Override
public DqCntlWfExec executeWorkflow(final DqExec dqExec,
final DqCntlWfDefn dqCntlWfDefn) {
final DqCntlWfExec dqCntlWfExec = new DqCntlWfExec();
dqCntlWfExec.setDqCntlWfExecEffDt(dqUtil.getDefaultEffectiveDt());
dqCntlWfExec.setDqCntlWfExecExpDt(dqUtil.getDefaultExpiryDt());
dqCntlWfExec.setDqCntlWfDefn(dqCntlWfDefn);
dqCntlWfExec.setDqExec(dqExec);
final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService
.getDqCntlWfDefnTypCd(dqCntlWfDefn);
String workflowType = null;
if(null!=dqCntlWfDefnTyp){
workflowType = dqCntlWfDefnTyp.getDqCntlWfDefnTypCd();
}
当我运行测试文件时,什么时候不工作,我在buildpath中使用mockito1.8.5 jar。正在模拟服务调用,但返回空值。
final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService
.getDqCntlWfDefnTypCd(dqCntlWfDefn);
此对象dqCntlWfDefnTyp为null
之前我已经完成了这个,并且没有问题,它似乎正在使用我以前做过的文件。我对测试文件采用了相同的程序,但我无法弄清楚问题。任何人都可以帮助我
感谢所有人提前
答案 0 :(得分:22)
Mockito mock在我们松散地模拟对象时起作用。
以下是我为使其发挥作用所做的改变:
when(controlWfDefTypeService.getDqCntlWfDefnTypCd(any(DqCntlWfDefn.class))
.thenReturn(dqCntlWfDefnTyp);
我没有传递Mock类的对象,而是使用Matcher any()
传递了该类,并且它有效。
答案 1 :(得分:4)
我遇到了同样的问题。我的解决方案是放Mockito.when(...)。thenReturn(...);进入@ Before-SetUp方法。
答案 2 :(得分:3)
我想我找到了你的问题,但不是所有的功劳都归功于我。
由于您试图在测试类中模拟“dqCntlWfDefnTyp”并且对象本身正在您尝试测试的类中实例化,因此您不可避免地会遇到一些问题。主要问题是无法模拟对象,因为它在测试期间正在重新创建。
有一些选择,但我认为最好的选择是使用PowerMockito。您将能够使用您模拟的对象替换正在测试的类中的对象。
来自@raspacorp的PowerMockito在question上使用的一个很好的例子:
public class MyClass {
void method1{
MyObject obj1=new MyObject();
obj1.method1();
}
}
测试班......
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class MyClassTest {
@Test
public void testMethod1() {
MyObject myObjectMock = mock(MyObject.class);
when(myObjectMock.method1()).thenReturn(<whatever you want to return>);
PowerMockito.whenNew(MyObject.class).withNoArguments().thenReturn(myObjectMock);
MyClass objectTested = new MyClass();
objectTested.method1();
... // your assertions or verification here
}
}
答案 3 :(得分:0)
TL; DR 如果测试中的某些参数是null
,请确保使用 isNull()
而非 any(SomeClass.class)
。
说明
这可能不是帮助OP的答案,但可能对其他人有用。就我而言,设置一切都很好,但是,有些模拟返回了所需的thenReturn(...)
值,而有些则没有。
重要的是要理解,您要模拟的方法调用(即when(someMock.methodToMock)
中的方法)必须与实际调用相匹配,而不必仅与签名相匹配。
就我而言,我嘲笑了一个带有签名的方法:
public void SomeValue method(String string, SomeParam param)
然而,测试中的呼叫类似于:
method("some string during test", null);
现在,如果您使用以下方法模拟通话:
when(MockedClass.method(anyString(), any(SomeParam.class))
即使签名正确,Mockito也不会匹配它。问题在于,Mockito正在使用参数method()
和String
查找SomeParam
的调用,而实际的调用是使用String
和 {{1 }} 。您要做的是:
null
提示
由于在不同的框架中有许多when(MockedClass.method(anyString(), isNull())
实现,因此请务必使用此isNull()
。