JMockit捕获模拟方法参数

3
我正在使用JMockit对调用不同web服务并填充数据库的数据服务进行单元测试。我对每个web服务调用进行模拟,并使用Expectations/results来提供返回数据给服务。
我遇到了一个问题,需要迭代一个对象列表并每次使用不同的参数调用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

}
}

这个可能吗?

你能否粘贴你的完整代码,以便更容易地回答你的问题。有时候,代码胜过千言万语(或类似的说法)... - ramsinb
代码细节已添加,尚未测试jdevelop的输入。 - chapsme
测试了jdevelop的输入,效果非常好!谢谢!编辑了代码以展示我是如何应用的。 - chapsme
1个回答

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);
  }
}

这将“记录”您的调用并允许您“捕获”参数。
或者查看验证调用参数 我使用了类似以下的代码:
mockedService.doMethod(with(new Object() {
  public void validate(SomeArg arg) {
    assertThat(arg.getProperty(), is(equalTo("expectation"));
  }
});

1
链接是404吗?还有更多的文本,这样SO才能接受我的评论。 - rogerdpack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接