我想在我的setUp方法中创建一个模拟,但是在每个测试方法中定义具体的返回值..这有可能吗?
例如:
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将使用更新的列表。 但即使使用已更改的ObjectIds,这种行为是否可行?所以我模拟了一个方法调用,但是定义了以后要返回的内容?
例如:
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
}
答案 0 :(得分:2)
你可以添加when(mock.xxx())。thenReturn(list);单独测试用例而不是setUp()。然后在testEmpty中返回emplty列表并返回list with 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
}
答案 1 :(得分:1)
所以..在经过一些试验和错误后,我已经做了这样的事情:
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中定义,不&#34;返回值&#34;,但是&#34;准备返回值的被调用方法&#34 ;并且由于此方法将首先在运行时调用,因此我们不会获得nullPointer,并且将返回我们在每个方法中分配的值。