我正在尝试使用字符串列表模拟请求,并使用传递的参数创建对象列表...类似:
when(tagDao.findByNameInOrderByName(Matchers.anyListOf(String.class))).thenReturn(new ArrayList<Tag>() {
/**
*
*/
private static final long serialVersionUID = 8227782193263533677L;
{
add(new Tag("name"));
add(new Tag("surname"));
}
});
我尝试了
之类的东西 when(tagDao.findByNameInOrderByName(Matchers.anyListOf(String.class))).thenReturn(new Answer<List<Tag>>() {
@Override
public List<Tag> answer(InvocationOnMock invocation) throws Throwable {
// Object[] args = invocation.getArguments();
List<Tag> tags = new ArrayList<Tag>();
return tags;
}
});
我收到以下错误:类型正在进行的方法中的方法thatReturn(list)>不适用于参数(新答案>(){})
我认为您应该使用thenAnswer
而不是thenReturn
when(tagDao.findByNameInOrderByName(Matchers.anyListOf(String.class))).thenAnswer(new Answer<List<Tag>>() {
@Override
public List<Tag> answer(InvocationOnMock invocationOnMock) throws Throwable {
Object[] args = invocationOnMock.getArguments();
List<Tag> tags = new ArrayList<Tag>();
return tags;
}
});
我想您正在寻找一个技术解决方案...应该以不同方式解决的问题。
您拥有的:您的代码正在测试中调用某些方法,并传递一个值列表。现在,您想以某种方式返回"围绕"这些传入值的结果构建。另一个答案告诉您如何到达那里(我会在哪里看到您是否可以使用参数captor进行此操作)。
但是让我们退后一步。请记住,您编写单元测试以测试一个某种方法的公共合同的特定方面。但是看来findByNameInOrderByName()
的>不同的调用。现在,您正在寻找一种为不同输入生成不同返回结果的方法。
我的建议不是不是这样做。相反:清楚地将事物分开为不同的测试柜。喜欢:
@Test
public void testXyzWithFooBar() {
when(tagDao.findByNameInOrderByName(Arrays.asList("foo", "bar").thenReturn(Arrays.asList(x, y));
... call xyz ...
@Test
public void testXyzWithFooOnly() {
when(tagDao.findByNameInOrderByName(Arrays.asList("foo").thenReturn(Arrays.asList(z, b));
... call xyz ...
换句话说:我宁愿避免让模拟对象基于输入参数隐式的其他复杂性。
而是:清楚地表达预期案例明确。这也导致更严格的测试。您的想法的意思是:任何东西都可以转到那个模拟的方法调用。我的版本明显陈述了您期望发生的事情。