在定义模拟后,我可以设置/更改模拟的返回值吗?

时间:2015-04-08 10:43:05

标签: java junit mocking mockito junit4

我想在我的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
}

2 个答案:

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