我使用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。
我想我已经发现了您的问题,但并非所有功劳都归功于我。
由于您尝试在测试类中模拟“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)