我需要测试一个以列表作为参数的方法。以下是示例代码:
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'对象上调用方法。
然后我改变了代码,我在那里模拟了一个列表和迭代器,所以现在我的代码运行正常。但是我想知道上面提到的代码有什么问题以及它失败的原因是什么?
答案 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);
}
}