当方法不起作用时的Mockito

2022-09-01 10:09:37

我正在使用moticato作为模拟框架。我在这里有一个场景,我的 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。服务调用正在被模拟,但返回 null 值。

final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService
    .getDqCntlWfDefnTypCd(dqCntlWfDefn);

此对象 dqCntlWfDefnTyp 为 null

我以前这样做过,什么时候没有问题,它似乎正在处理我以前做过的文件。我对测试文件遵循了相同的过程,但我无法弄清楚问题所在。任何人都可以帮助我

提前感谢大家


答案 1

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

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

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

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


答案 2

TL;DR如果测试中的某些参数是 ,请确保使用 isNull() 而不是 any(SomeClass.class) 来模拟参数调用。null


解释

这可能不是帮助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 正在寻找带有参数和 的调用,而实际的调用是带有 a 和 null 的。您要做的是:method()StringSomeParamString

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

提示

由于在不同的框架中有许多实现,因此请务必使用这个 。isNull()org.mockito.ArgumentMatchers.isNull


推荐