我想在我的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,并且我们在每个方法中分配的值都将被返回。