2012-11-06 26 views
3

我正在使用JMockit來單元測試調用不同Web服務並填充數據庫的數據服務。我正在嘲笑每個Web服務調用,並使用Expectations/results來爲服務提供我的返回數據。jmockit捕獲mocked方法參數

我有一個問題,我必須迭代對象列表並每次調用Web服務使用不同的參數。我想捕獲這個參數,以便將它提供給一個CreateTestData方法,該方法將返回我想要的。 數據集是一定程度上取決於彼此

測試類:

public class testDataService { 

@Mocked 
private WebService1 webServiceClientMocked1; 

@Mocked 
private WebService2 webServiceClientMocked2; 

@Autowired 
private DataService dataService; 

@Test 
public void createTestData() { 

final DataSet1 dataSet1 = CreateMyTestData.createDataSet1(); 
final DataSet1 dataSet2 = CreateMyTestData.createDataSet2(); 

// these are populated using other methods not shown 
final List<String> listStrings = new ArrayList<String>(); 
final List<String> entities = new ArrayList<String>(); 

new Expectations() {{ 
     webServiceClientMocked1.getDataSet1("stringA", true); 
     result = dataSet1; 
    }}; 

new Expectations() {{ 
     webServiceClientMocked2.getDataSet2("stringB"); 
     result = dataSet2; 
    }}; 

new Expectations() {{ 
for(String s : listStrings){ 
    webServiceClientMocked1.getDataSet4(s,(List<String>) any); 
    returns(CreateMyTestData.createDataSet4(s, entities)); 
     } 

    }}; 


//doesnt work  
//new Expectations() {{ 
//webServiceClientMocked1.findDataPerParamters(anyString, (List<String>) any); 
//result = CreateMyTestData.createDataSet4(capturedString, capturedListStrings); 
//}}; 

//call data service to test 
dataService.doSaveData(); 
} 

數據服務類:

public class DataServiceImpl implements DataService 
{ 

public void doSaveData() { 

    //do a bunch of stuff 
    dataSet1 =webServiceClientMocked1.getDataSet1("stringA", true); 
    //do more stuff 
    dataSet2 = webServiceClientMocked2.getDataSet2("stringB"); 
    Collection<Stuff> dataSet3 = saveToDB(dataSet2); //save data and return a different set of data 

    for(Stuff data : dataSet3) { 

    //take dataSet3, iterate over it and call another webservice 
    dataSet4 = webServiceClientMocked1.getDataSet4(data.getStringX(), data.getListStrings()); 

// keep doing more junk 

} 
} 

這是可能的?

+0

可以粘貼顯示你的完整代碼,其中的問題是,這樣的比較容易回答。有時一些代碼比千言萬語(或類似的東西)更好... – ramsinb

+0

添加了代碼細節,尚未測試jdevelop的輸入但 – chapsme

+0

測試了jdevelop的輸入,它工作的很棒!謝謝!!編輯代碼以顯示我如何應用。 – chapsme

回答

2

您可以使用類似:

final List<String> args = Arrays.asList("1","2","3","4"); 
final Map<String,Object> results = .... 

然後期望:

new Expectations() { 
{ 
    for (arg : args) { 
    mockedService.invoke(arg); 
    returning(results.get(arg); 
    } 
} 

這將 「記錄」 您的調用,並允許您 「捕獲」 的論點。

或檢查Validating invocation arguments

我用這樣的代碼

mockedService.doMethod(with(new Object() { 
    public void validate(SomeArg arg) { 
    assertThat(arg.getProperty(), is(equalTo("expectation")); 
    } 
}); 
+0

鏈接是404嗎?和更多的文字,所以SO會接受我的評論 – rogerdpack