方法不工作时Mockito

时间:2013-12-11 11:14:43

标签: java mockito

我使用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

之前我已经完成了这个,并且没有问题,它似乎正在使用我以前做过的文件。我对测试文件采用了相同的程序,但我无法弄清楚问题。任何人都可以帮助我

感谢所有人提前

4 个答案:

答案 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()