将私有字段注入测试方法

时间:2018-01-12 13:09:30

标签: java unit-testing testing mockito

简单的问题,我有一个带有Items的List字段的类,我有一个在该List上运行的方法,检查是否有一个名称在参数中给出并且返回true或false的Item。我想测试该方法,在测试类中创建一个ArrayList,模拟JdbcItemDao类,并调用一个方法。测试方法无法到达阵列,如何修复?代码:

     public class JdbcItemDao {
     private List<Item> tempStockList;

    public JdbcItemDao() {

    this.tempStockList = getAllStockItems();

   //getting items from my sql, returning them as ArrayList

}

  public boolean checkStockItems(String itemName) {
    for (Item item : tempStockList) {
        if (item.getItemName().equalsIgnoreCase(itemName)) {
            return true;
        }
    }
    return false;
}}

测试类:

public class JdbcTest {


JdbcItemDao jdbcItemDao;
List<Item> tempStockList;

@Before
public void setup() {

    jdbcItemDao = mock(JdbcItemDao.class);
    tempStockList = new ArrayList<>();
    tempStockList.add(new Item(1, "LEDTv", new BigInteger("40"),
            new Integer("3"), new BigInteger("70")));

}


@Test
public void checkStockItemsName() throws Exception {

   assertTrue(jdbcItemDao.checkStockItems("LEDTv"));

}}

3 个答案:

答案 0 :(得分:0)

您使用了错误的 test double 。你需要一个 spy (它是真正实现的包装器)而不是 mock (它是一个重写被模拟类的所有方法的子类):

jdbcItemDao = spy(new JdbcItemDao());

tempStockList = new ArrayList<>();
tempStockList.add(new Item(1, "LEDTv", new BigInteger("40"),
        new Integer("3"), new BigInteger("70")));
doReturn(tempStockList).when(jdbcItemDao).getAllStockItems();

关闭原因只有在您移动

时才有效
this.tempStockList = getAllStockItems();

构造函数......

答案 1 :(得分:0)

有一个方法&#39; getAllStockItems&#39;,它在JdbcItemDao.java类

public List<Item> getAllStockItems() {
    return jdbcTemplate.query(SELECT_ALL_STOCK_ITEMS, itemRowMapper);
}

它从MySQL数据库获取数据,这就是为什么我想在测试中使用假数组。

答案 2 :(得分:0)

如果你无法重构,我猜你的左边是创建一个私有类,重写方法并使用该类进行测试:

public class JdbcTest {

   List<Item> tempStockList = new ArrayList<>();

   @Before
   public void setup() {

    tempStockList = new ArrayList<>();
    tempStockList.add(new Item(1, "LEDTv", new BigInteger("40"),
            new Integer("3"), new BigInteger("70")));

   }


   @Test
   public void checkStockItemsName() throws Exception {
     JdbcItemDao jdbcItemDao = new CustomJdbcItemDao();
     assertTrue(jdbcItemDao.checkStockItems("LEDTv"));

   }

   private class CustomJdbcItemDao extends JdbcItemDao{

      @Override
      public List<Item> getAllStockItems(){
        return tempStockList;
      }
   }

}