在定义mock之后,我可以设置/更改mock的返回值吗



我想在我的setUp方法中创建一个mock,但在每个测试方法中定义具体的返回值。。这有可能吗?

例如:

private List<Long> list; 
@Before
public void setUp() {
    when(mock.xxx()).thenReturn(list);
}
@Test
public void testEmptyList() {
    list = new ArrayList<Long>();
    // method call
}
@Test
public void testWithOneElement() {
    list = Arrays.asList(Long.valueOf(125L));
    // method call
}

编辑:我能想到的最好的情况是:

private List<Long> list = new ArrayList<Long>();
@Before
public void setUp() {
    when(mock.xxx()).thenReturn(list);
}
@Test
public void testEmptyList() {
    // method call
}
@Test
public void testWithOneElement() {
    list.add(Long.valueOf(123L));
    // method call
}

由于Java通过引用传递值,只要我们不为列表分配一个新列表,我们就可以添加值,mock将处理更新后的列表。但是,即使改变了ObjectId,这种行为在某种程度上也是可能的吗?所以我模拟了一个方法调用,但定义了以后要返回什么?

例如:

private List<Long> list; 
@Before
public void setUp() {
    when(mock.xxx()).thenReturn(list);
}
@Test
public void testEmptyArrayList() {
    list = new ArrayList<Long>();
    // method call
}
@Test
public void testEmptyLinkedList() {
    list = new LinkedList<Long>();
    // method call
}

您可以添加when(mock.xxx()).thenReturn(list);分别添加到您的测试用例中,而不是在setUp()中。然后在testEmpty中返回empty列表,并在testWithOneElement 中返回带有一个元素的列表

private List<Long> list; 
@Before
public void setUp() {
    // Other setup here
}
@Test
public void testEmptyList() {
    list = new ArrayList<Long>();
    when(mock.xxx()).thenReturn(list); // return list with no element
    // method call
}
@Test
public void testWithOneElement() {
    list = Arrays.asList(Long.valueOf(125L));
    when(mock.xxx()).thenReturn(list);  // return list with one elemet
    // method call
}

所以。。经过一番尝试和错误,我做出了这样的东西:

private List<Long> list; 
@Before
public void setUp() {
    when(mock.xxx()).thenAnswer(
            new Answer<List<Long>>() {
                @Override
                public List<Long> answer(final InvocationOnMock invocation) {
                    return list;
                }
            });
}
@Test
public void testEmptyArrayList() {
    list = new ArrayList<Long>();
    // method call
}
@Test
public void testEmptyLinkedList() {
    list = new LinkedList<Long>();
    // method call
}

由于我们现在在setUp中定义了而不是"返回值",而是是"准备返回值的被调用方法",并且由于该方法将首先在运行时调用,因此我们不会得到nullPointer,并且我们在每个方法中分配的值都将被返回。

相关内容

  • 没有找到相关文章

最新更新