我可以在定义 mock 后 set/change mock 的 return 值吗?
Can i set/change the return value of a mock after the mock is defined?
我想在我的 setUp 方法中创建一个模拟,但在每个测试方法中定义具体的 return 值..这在某种程度上可能吗?
例如:
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,这种行为是否也可能以某种方式发生?所以我模拟了一个方法调用,但稍后定义要 return 的内容?
例如:
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() 中。然后 return testEmpty 中的空列表和 return 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 中定义,不是 "return value",而是 "the called method which prepares the return value",并且由于此方法会在运行时先被调用,我们并没有得到一个nullPointer,我们在每个方法中赋值的值都会被返回。
我想在我的 setUp 方法中创建一个模拟,但在每个测试方法中定义具体的 return 值..这在某种程度上可能吗?
例如:
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,这种行为是否也可能以某种方式发生?所以我模拟了一个方法调用,但稍后定义要 return 的内容?
例如:
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() 中。然后 return testEmpty 中的空列表和 return 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 中定义,不是 "return value",而是 "the called method which prepares the return value",并且由于此方法会在运行时先被调用,我们并没有得到一个nullPointer,我们在每个方法中赋值的值都会被返回。