如何单元测试接收和返回对象列表的方法

时间:2014-07-16 06:11:48

标签: java junit4

我的类如下,它接收一个字符串并使用它创建一个对象的arraylist。 我不确定如何测试它。

 public class Company{
        private String id;
        private String name;
        ....
 }

 public List<Company> retrieve(String factories) {
        String[] fac = factories.split(",");
        List<Company> comp;
        comp = new ArrayList<>();
        for (int i = 0; i < fac.length - 1; i++) {
            comp.add(new Company(fac[i], fac[i]));
        }
        return comp;
    }

JUnitTest

    @Test
    public void testRetrieve() {
        System.out.println("retrieve");
        String factories = "a,b,c";
        Transact instance = new Transact();
        List<Company> expResult = null; //<<<how to define this?
        List<Company> result = instance.retrieveData(factories);
        assertEquals(expResult, result);
    }

3 个答案:

答案 0 :(得分:2)

定义您的预期结果

List<Company> expResult = null;// it shouldn't be null

它应该是从您的方法返回的内容。

让我们说当你通过

String factories = "some sting"; 

应该从您的方法返回List x,然后创建List x

你可以尝试这样的事情。

 @Test
 public void testRetrieve() {
    System.out.println("retrieve");
    String factories = "a,b,c";
    Transact instance = new Transact();
    List<Company> expResult = new ArrayList<>(); 
    Company com1=new Company("a","a");
    Company com2=new Company("b","b");
    Company com3=new Company("c","c");
    expResult.add(com1);
    expResult.add(com2);
    expResult.add(com3);
    List<Company> result = instance.retrieveData(factories);
    assertEquals(expResult, result);
 }

我认为现在你可以编写自己的测试用例了。

答案 1 :(得分:1)

您应该根据单元测试中的预期结果测试实际结果。

所以你&#34;假设&#34;如果你的课程写得正确(那是你检查的内容),那么你应该得到你所期望的公司课程列表,这就是结果。

我会给你一个更简单的例子。 让我们假设你要用单元测试来检查产生两个数字之和的方法:

int sum(int a, int b) {
    return a + b;
} 

因此,单元测试应提供输入并根据实际输出验证预期输出。

所以你走了:

// unit test
int expectedOutput = 10;
int actualOutput = sum(3,7);

assertEquals(expectedOutput, actualOutput);

换句话说,你&#34;确保&#34;根据您的输入,该方法生成的actualOutput符合您的期望。这是检查方法是否正确实现的方法。

现在让我们回到你的榜样。 事实上,你必须验证&#34;公司&#34;课程是正确的。

因此,您的预期输出也是一个列表,问题实际上是您如何将实际的公司列表与预期的公司列表进行比较。

在Java中,鉴于您已经定义了&#34;等于&#34;类#34;公司&#34;上的方法,你可以安全地检查assertEquals(它应该适用于列表,给你使用像ArrayList这样的东西)

预期结果可以像这样生成:

List<Company> expectedResult = Arrays.asList(new Company(...), new Company(...));

希望这有助于和快乐的单元测试:)

答案 2 :(得分:0)

我喜欢为每个场景创建不同的方法。您已经测试了空白列表&#34;场景。以下是其他一些内容:

// The happy path
@Test
public void testMultipleCompanies() {
  Transact instance = new Transact();
  List<Company> companies = instance.retrieveData("firstCompany,secondCompany");
  assertTrue(companies.size() == 2);
  assertEquals(companies.get(0).getId().equals("firstCompany");
  assertEquals(companies.get(0).getName().equals("firstCompany");
  assertEquals(companies.get(1).getId().equals("secondCompany");
  assertEquals(companies.get(1).getName().equals("secondCompany");
}

// The null string scenario
@Test(expected=NullPointerException.class)
public void testNull() {
  Transact instance = new Transact();
  instance.retrieveData(null);
}