在单元测试时访问私有ArrayList(Java / JUnit)

时间:2018-03-28 07:13:33

标签: java junit

为操作对象ArrayList的类编写单元测试(JUnit)。是否可以直接测试该ArrayList的内容,或者我只需要测试从ArrayLists返回格式化信息的函数并使用它来测试程序的其余部分? (以下代码)

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class HardeWareStore {
  private ArrayList<Item> itemList;

  public HardwareStore() throws IOException {
    itemList = new ArrayList<>();
  }


  public String getAllItemsFormatted() {
    return getFormattedItemList(itemList);
  }

private String getFormattedItemList(ArrayList<Item> items) {

    String text = " ------------------------------------------------------------------------------------\n" +
            String.format("| %-10s| %-25s| %-20s| %-10s| %-10s|%n", "ID Number", "Name", "Category", "Quantity", "Price") +
                  " ------------------------------------------------------------------------------------\n";

    for (int i = 0; i < items.size(); i++) {
        text += String.format("| %-10s| %-25s| %-20s| %-10s| %-10s|%n",
                items.get(i).getIdNumber(),
                items.get(i).getName(),
                items.get(i).getCategory(),
                Integer.toString(items.get(i).getQuantity()),
                String.format("%.2f", items.get(i).getPrice()));
    }
    text += " ------------------------------------------------------------------------------------\n";

    return text;
}

public void addNewItem(String idNumber, String name, String category, int quantiy, float price) {
    //If passed all the checks, add the item to the list
    itemList.add(new Item(idNumber, name, category, quantiy, price));
    System.out.println("Item has been added.\n");
}

(这是一项任务,因此不能以任何方式更改源代码)

测试类是否有任何方法可以知道&#34; itemList&#34;中的内容,因此我可以测试&#34; addNewItem&#34;方法,而不依赖于另一种方法,如&#34; getFormattedItemList&#34;?

1 个答案:

答案 0 :(得分:1)

你可以使用反射。如果您需要访问私有字段,则需要从类的声明字段中获取它们,然后使它们可访问:

HardwareStore obj = new HardwareStore();
Field field = obj.getClass().getDeclaredField("itemList");
field.setAccessible(true);
ArrayList<Item> itemList = (ArrayList<Item>) field.get(obj);
相关问题