gpt4 book ai didi

java - 没有为 Void 方法调用用于修改传递的对象的 doAnswer()

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:05 25 4
gpt4 key购买 nike

用例:

我想用对象列表调用模拟类的方法,并想修改传递的参数。如果我处理某些具有返回类型的方法并且不适用于 Void 返回方法,它会工作正常。

测试方法:

 public class TestClass{
@Autowired

PersistActivity activity;

public void methodToTest(List<URLObject> urlObjects) {
List<URLObject> urlObjects2PerformAction = new ArrayList<URLObject>();

for (URLObject urlObject : urlObjects) {
// Added this check to make sure, we are not running a previous
// activity which is successful.
if (urlObject.getRetryCountMap().get(currentActivityName) != null) {
urlObjects2PerformAction.add(urlObject);
}
}
boolean activityStatus = true;
try {
log.info("Calling activity " + currentActivityName + " with " + urlObjects2PerformAction);
activity.doActivity(urlObjects2PerformAction);
log.info("UrlObjects are " + urlObjects2PerformAction);
} catch (Exception e) {
//another set of actions.
}
for (URLObject urlObject : urlObjects) {
if (!urlObject.isActivitySuccessful()) {
// If complete call failed or partial data failed, update
log.info("Failed for message " + urlObject);
} else {
log.info("Passed for message " + urlObject);
}
}//end for
}//end method
}//end class

在此示例中,我想修改 urlObjects 以将其 boolean 变量之一填充为 true/false。

我添加了一个 doAnswer()测试用例中的子句如下:

测试类:

  public class TestMe{
@Mock
private PersistActivity activity;

@Captor
private ArgumentCaptor<List<URLObject>> argument;

@InjectMocks
private DCUrlPersistor dcUrlPersisor = new DCUrlPersistor();


@Test
public void runIndividualDeamonWithMultipleMessagesSomeFailing() throws Exception {


URLObject urlObject1 = getUrlObject(normalizedUrl, normalizedUrl, scraperName);
URLObject urlObject2 = getUrlObject("test2.com", "test2.com", "gpsUS");


Map<String,Integer> retryCountMap = new HashMap<String, Integer>();
retryCountMap.put(PersisterActivitiesEnum.CSI.getName(), 0);

urlObject1.setRetryCountMap(retryCountMap);
urlObject2.setRetryCountMap(retryCountMap);

/**
* Change argument passed to the method.
*/
doAnswer(new Answer<Object>() {

@Override
public Object answer(InvocationOnMock invocation)
throws Throwable
{
Object[] arguments = invocation.getArguments();

if ( arguments != null
&&
arguments.length > 0
&&
arguments[0] != null)
{
List<URLObject> objs = (List<URLObject>) arguments[0];
Assert.assertNotNull(objs.get(0).getRetryCountMap());
objs.get(0).setActivitySuccessful(false);
}
return null;
}
}).when(activity).doActivity(anyList());


doNothing().when(activity).doActivity(Arrays.asList(urlObject1, urlObject2));

/**
* Call method.
*/
dcUrlPersisor.methodToTest(Arrays.asList(urlObject1, urlObject2));
/**
* Verify various instances and logs.
*/
verify(activity, times(1)).doActivity(argument.capture());
assertEquals(2, argument.getValue().size());
assertEquals(normalizedUrl, argument.getValue().get(0).getNormalizedURL());
Assert.assertTrue(logContains("Calling activity csi with "));
//-----This is the part which fails as log never prints this message----//
Assert.assertTrue(logContains("Failed for message"));


}
}

问题:

如果我更改 doActivity 的返回类型方法是List<ABC>Void ,然后它会被调用并按预期工作(无需更改测试代码)。

我们是否需要对 void 方法进行一些更改?我已经设置它在doAnswer中返回void。

如有任何帮助,我们将不胜感激。

最佳答案

尝试删除以下行:

doNothing().when(activity).doActivity(Arrays.asList(urlObject1, urlObject2));

对我来说,这似乎与它之前的 doAnswer 设置有点相反。

关于java - 没有为 Void 方法调用用于修改传递的对象的 doAnswer(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18462646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com