模拟基于参数的列表



我正在尝试使用字符串列表模拟请求,并使用传递的参数创建对象列表...类似:

        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 ...

换句话说:我宁愿避免让模拟对象基于输入参数隐式的其他复杂性。

而是:清楚地表达预期案例明确。这也导致更严格的测试。您的想法的意思是:任何东西都可以转到那个模拟的方法调用。我的版本明显陈述了您期望发生的事情。

相关内容

  • 没有找到相关文章

最新更新