我可以在定义 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,我们在每个方法中赋值的值都会被返回。