2012-07-26 14 views
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; 
} 

回答

1

你不能注入事情变成模拟,你可以设定对它的期望

取而代之的是(它给你你意想不到的除外):

mockAdapter.setName(BAPI_NAME); 

你可能在你的期望做到这一点:

atLeast(1).of(mockAdapter).getName(); 
will(returnValue(BAPI_NAME)); 
+0

谢谢...... @ Bedwyr我试图打通所有Junit测试都会追溯到我所从事的项目,然后尝试未来的TDD路线。这是一种不同的思考方式,但在我看来,这是专业的方式。所以,这是我自己做的事情。我结束了也试验'允许'和'忽略',我忘了。我喜欢JMock,因为它也适用于接口。我也是这个要求的粉丝。 – Davidson 2012-08-07 20:15:03

+0

你也可以用ClassImposteriser来嘲弄具体的类 - 但是我也喜欢JMock,因为它比缺乏“功能”,比如EasyMock/Powermock – blank 2012-08-08 08:06:42

相关问题