单元测试一个以列表作为参数的方法

时间:2017-09-05 11:33:43

标签: java unit-testing arraylist mockito

我需要测试一个以列表作为参数的方法。以下是示例代码:

public class C
{
    private int x;
    private String y;
    //getters and setters
}
public class B
{
    public void collectC(List<C> cList)
    {
        for(C c : cList)
        {
            System.out.println("int: " + c.getX() + "String: "+ c.getY());
        }
    }
}

因此,B类只是使用增强的for循环收集C类对象并对其进行迭代。 现在,我想测试一个B类的方法。下面是测试代码。

public class BTest
{
    private List<C> cList;
    @Mock private C c;
    @InjectMocks private B b;

    @Before
    public void setUp()
    {
        cList = new ArrayList<>();
        cList.add(c);
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testCollectC()
    {
        Mockito.when(c.getX()).thenReturn(5);
        Mockito.when(c.getY()).thenReturn("Hello There");
        b.collectC(cList);
    }
}

所以,这会在NullPointerException一行上给出错误System.out.println(),我在'c'对象上调用方法。 然后我改变了代码,我在那里模拟了一个列表和迭代器,所以现在我的代码运行正常。但是我想知道上面提到的代码有什么问题以及它失败的原因是什么?

1 个答案:

答案 0 :(得分:2)

您必须先将c 实例添加到cList,否则cList包含空元素。

以下测试通过:

public class BTest {
    private List<C> cList;
    @Mock
    private C c;

    @InjectMocks
    private B b;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        cList = new ArrayList<>();
        cList.add(c);
    }

    @Test
    public void testCollectC() {
        Mockito.when(c.getX()).thenReturn(5);
        Mockito.when(c.getY()).thenReturn("Hello There");
        b.collectC(cList);
    }
}