方法不起作用时的 Mockito

新手上路,请多包涵

我正在使用 mockito 作为模拟框架。我这里有一个场景,我的 when(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();
}

每当我运行测试文件时,当它不起作用时,我在构建路径中使用 mockito1.8.5 jar。正在模拟服务调用但返回空值。

 final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService
    .getDqCntlWfDefnTypCd(dqCntlWfDefn);

此对象 dqCntlWfDefnTyp 为空

我以前做过这个,当时没有问题,它似乎正在处理我以前做过的文件。我对测试文件遵循了相同的程序,但我无法找出问题所在。谁能帮帮我

提前感谢所有的人

原文由 Gopi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

当我们松散地模拟对象时,Mockito 模拟工作。

这是我为使其工作所做的更改:

 when(controlWfDefTypeService.getDqCntlWfDefnTypCd(any(DqCntlWfDefn.class))
    .thenReturn(dqCntlWfDefnTyp);

我没有传递 Mock 类的对象,而是使用 Matcher any() 传递了该类并且它有效。

原文由 Gopi 发布,翻译遵循 CC BY-SA 3.0 许可协议

TL;DR 如果您测试中的某些参数是 null ,请务必使用 isNull() 而不是 any(SomeClass.class) fba.84– 模拟参数调用


解释

这可能不是对 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 也不会匹配它。 The problem is that Mockito is looking for a call of method() with the arguments String and SomeParam , whereas the actual call was with a Stringnull 。你要做的是:

 when(MockedClass.method(anyString(), isNull())


暗示

由于在不同的框架中有很多 isNull() 实现,所以一定要使用这个 org.mockito.ArgumentMatchers.isNull

原文由 Younes El Ouarti 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题