Java 模拟返回基于参数的列表
我正在尝试使用字符串列表模拟请求,并使用传递的参数创建对象列表。。。比如:Java 模拟返回基于参数的列表,java,mocking,mockito,Java,Mocking,Mockito,我正在尝试使用字符串列表模拟请求,并使用传递的参数创建对象列表。。。比如: when(tagDao.findByNameInOrderByName(Matchers.anyListOf(String.class))).thenReturn(new ArrayList<Tag>() { /** * */ private static final long serialVersionUID = 8227
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 ArrayList()){
/**
*
*/
私有静态最终长serialVersionUID=822778219326353677L;
{
添加(新标签(“名称”);
添加(新标签(“姓氏”);
}
});
我试过类似的方法
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;
}
});
when(tagDao.findByNameInOrderByName(Matchers.anyListOf(String.class))。然后返回(new-Answer(){
@凌驾
公共列表应答(invocationMock调用)抛出可丢弃的{
//对象[]args=invocation.getArguments();
列表标记=新的ArrayList();
返回标签;
}
});
我得到了以下错误:
ongoingstubing>类型中的thenReturn(List)方法不适用于参数(new Answer>(){})我认为您应该使用
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;
}
});
when(tagDao.findByNameInOrderByName(Matchers.anyListOf(String.class)).thenAnswer(new-Answer()){
@凌驾
公共列表应答(InvocationMock InvocationMock)抛出可丢弃的{
对象[]args=invocationMock.getArguments();
列表标记=新的ArrayList();
返回标签;
}
});
我认为你应该使用然后回答
而不是然后返回
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;
}
});
when(tagDao.findByNameInOrderByName(Matchers.anyListOf(String.class)).thenAnswer(new-Answer()){
@凌驾
公共列表应答(InvocationMock InvocationMock)抛出可丢弃的{
对象[]args=invocationMock.getArguments();
列表标记=新的ArrayList();
返回标签;
}
});
我想您正在寻找技术解决方案。。。对于一个应该以不同方式解决的问题
您所拥有的:一些方法被您的测试代码调用,传递一个值列表。现在,您希望以某种方式返回“围绕”这些传入值的结果构建。另一个答案告诉你如何到达那里(我想看看你是否可以使用ArgumentCaptor)
但让我们退一步。请记住,编写单元测试是为了测试某种方法的公共契约的一个特定方面。但是,对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 ...
换句话说:我宁愿努力避免让模拟对象根据输入参数隐式返回某些内容的额外复杂性
取而代之的是:明确地表达预期的情况。这也导致了更严格的测试。你的想法意味着:任何东西都可以进入模拟方法调用。我的版本清楚地说明了您希望发生的事情。我想您正在寻找技术解决方案。。。对于一个应该以不同方式解决的问题 您所拥有的:一些方法被您的测试代码调用,传递一个值列表。现在,您希望以某种方式返回“围绕”这些传入值的结果构建。另一个答案告诉你如何到达那里(我想看看你是否可以使用ArgumentCaptor) 但让我们退一步。请记住,编写单元测试是为了测试某种方法的公共契约的一个特定方面。但是,对
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 ...
换句话说:我宁愿努力避免让模拟对象根据输入参数隐式返回某些内容的额外复杂性
取而代之的是:明确地表达预期的情况。这也导致了更严格的测试。你的想法意味着:任何东西都可以进入模拟方法调用。我的版本清楚地说明了你期望发生的事情