方法不工作时Mockito

Gop*_*han 12 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);
}
Run Code Online (Sandbox Code Playgroud)

}

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();
}
Run Code Online (Sandbox Code Playgroud)

当我运行测试文件时,什么时候不工作,我在buildpath中使用mockito1.8.5 jar.正在模拟服务调用但返回null值.

final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService
    .getDqCntlWfDefnTypCd(dqCntlWfDefn);
Run Code Online (Sandbox Code Playgroud)

该对象dqCntlWfDefnTyp为null

我以前做过这个,并没有问题什么时候,它似乎与我以前做过的文件一起工作.我对测试文件采用了相同的程序,但我无法弄清楚问题.任何人都可以帮助我

感谢所有人提前

Gop*_*han 25

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

以下是我为使其发挥作用所做的改变:

when(controlWfDefTypeService.getDqCntlWfDefnTypCd(any(DqCntlWfDefn.class))
    .thenReturn(dqCntlWfDefnTyp);
Run Code Online (Sandbox Code Playgroud)

我没有传递Mock类的对象,而是通过Matcher传递了any()它,它起作用了.


Cof*_*Pro 15

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


解释

这可能不是帮助 OP 的答案,但可能对其他人有用。在我的情况下,设置都很好,但是,有些模拟返回了所需的thenReturn(...)值,有些则没有。

重要的是要了解,您尝试模拟的方法调用(即 中的方法when(someMock.methodToMock))必须与实际调用相匹配而不仅仅是签名

就我而言,我嘲笑了一个带有签名的方法:

public void SomeValue method(String string, SomeParam param)
Run Code Online (Sandbox Code Playgroud)

然而,在测试中的调用是这样的:

method("some string during test", null);
Run Code Online (Sandbox Code Playgroud)

现在,如果你模拟调用:

when(MockedClass.method(anyString(), any(SomeParam.class))
Run Code Online (Sandbox Code Playgroud)

即使签名正确,Mockito 也不会匹配它。问题是 Mockito 正在寻找method()带有参数StringandSomeParam的调用,而实际调用是带有Stringand 的null。你需要做的是:

when(MockedClass.method(anyString(), isNull())
Run Code Online (Sandbox Code Playgroud)

暗示

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

  • 你是一个真正的没有斗篷的英雄 (2认同)

Cha*_*Hey 8

我想我已经发现了您的问题,但并非所有功劳都归功于我。

由于您尝试在测试类中模拟“dqCntlWfDefnTyp”,并且对象本身正在您尝试测试的类中实例化,因此您不可避免地会遇到一些问题。主要问题是对象不能被模拟,因为它在测试期间被重新创建。

有几种选择,但在我看来,最好的选择是使用PowerMockito。您将能够用您模拟的对象替换正在测试的类中的对象。

@raspacorp 在这个问题上使用 PowerMockito 的一个很好的例子:

public class MyClass {
void method1{
    MyObject obj1=new MyObject();
    obj1.method1();
}
}
Run Code Online (Sandbox Code Playgroud)

还有考试班...

@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 
}
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我有同样的问题。我的解决方案是把 Mockito.when(...).thenReturn(...); 进入@Before-SetUp 方法。