2017-08-30 50 views
0

我想用一组字符串嘲笑的请求,并使用参数对象的名单列表过去了...是这样的:模拟返回基于参数

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

而且我得到了以下错误: 方法thenReturn(列表)在类型OngoingStubbing>不适用的参数(新的答案>(){})

回答

3

我瘦k的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; 
      } 
     }); 
1

我想你找你找的是技术解决方案...到应该以不同的方式来解决的问题,你应该使用。

你有什么:一些方法是由你的测试代码调用,传递一个值列表。现在你想以某种方式返回一个结果“围绕”这些传入的值。另一个答案告诉你如何到达那里(我会看看是否可以使用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 ... 

换句话说:我宁愿努力避免具有基于输入参数模拟对象一些回报隐含额外的复杂性。

取而代之的是:明确表达预期的情况明确。这也导致更严格的测试。你的想法意味着:什么都可以去那个模拟方法调用。我的版本显然陈述你期望发生。