1
我的问题:如何创建一个模拟对象并通过构造函数或setter注入属性?如何将值注入模拟对象的构造函数或通过setter?我得到意想不到的调用错误
我收到意外的调用错误。我正在@Before中的模拟对象上设置一个设置我的BAPI的名称属性。当我执行测试时,我的setName方法出现意外的调用错误。但是,我真的不想测试这种方法。我只是插入它,所以当我的代码执行方法checkParm(b)时,值就在那里。
如果我不嘲笑setter的任何期望,我会得到意想不到的调用。但是,如果我将这些代码添加到期望中,我仍然会收到意外的调用。
ignoring(mockAdapter).setName(BAPI_NAME);
inSequence(sequence);
这里是我的@Before方法
@Before
public void setUp() throws Exception {
objectUnderTest = new ApoSAPExtractor();
mockAdapter = context.mock(BapiAdapter.class);
mockAdapter.setName(BAPI_NAME);
apoResults = new ApoResults();
apoParameterBean = new ApoParameterBean();
}
然后我的测试方法:
@Test
public final void testExtract() throws Exception {
final Sequence sequence = context.sequence(SEQUENCE);
context.checking(new Expectations() {{
atLeast(1).of(mockAdapter).getName();
will(returnValue(new String()));
inSequence(sequence);
oneOf(mockAdapter).activate();
inSequence(sequence);
oneOf(mockAdapter).getImportTableParameter(IM_PARMS);
inSequence(sequence);
will(returnValue(JCoTable.class));
oneOf(mockAdapter).execute();
inSequence(sequence);
oneOf(mockAdapter).getExportTableAdapter(EX_PO_APO);
inSequence(sequence);
will(returnValue(new TableAdapter(with(any(JCoTable.class)))));
}});
objectUnderTest.extract(mockAdapter, apoParameterBean);
context.assertIsSatisfied();
}
类,我嘲笑:
public class ApoSAPExtractor implements SAPExtractor<ApoResults, ApoParameterBean> {
private final static Logger logger = Logger.getLogger(ApoSAPExtractor.class);
public List<ApoResults> extract(BapiAdapter b, ApoParameterBean pb) throws JCoException, Exception {
checkParm(b);
List<ApoResults>list = new ArrayList<ApoResults>();
try {
b.activate();
JCoTable itp = b.getImportTableParameter(APOConstants.BAPI_IM_PARMS);
itp.appendRow();
JCoTable t = itp.getTable(APOConstants.BAPI_DOC_TYPES);
Utils.appendParm(t, pb.getDocTypes());
b.execute();
TableAdapter ta = b.getExportTableAdapter(APOConstants.BAPI_EX_PO_APO);
for (int i = 0; i < ta.size(); i++) {
ApoResults ar = new ApoResults();
... lots of setters ...
list.add(ar);
ta.next();
}
} catch (Exception e) {
logger.info(String.format("Program %s failed.",this.getClass().getSimpleName(), "failed"));
e.printStackTrace();
throw e;
}
return list;
}
谢谢...... @ Bedwyr我试图打通所有Junit测试都会追溯到我所从事的项目,然后尝试未来的TDD路线。这是一种不同的思考方式,但在我看来,这是专业的方式。所以,这是我自己做的事情。我结束了也试验'允许'和'忽略',我忘了。我喜欢JMock,因为它也适用于接口。我也是这个要求的粉丝。 – Davidson 2012-08-07 20:15:03
你也可以用ClassImposteriser来嘲弄具体的类 - 但是我也喜欢JMock,因为它比缺乏“功能”,比如EasyMock/Powermock – blank 2012-08-08 08:06:42