繁体   English   中英

使用ArrayList私有成员测试类

[英]Testing class with ArrayList private member

我有一个具有以下实现的Java类:

    class Some {
      private ArrayList<SomeObject> list = new...

      public void addToList(Long t) {
          SomeObject so = new SomeObject(new Date, t)
          list.add(so)
      } 

      private float fun1(ArrayList<SomeObject> x) {
      //some operations on list "list", 
      //res - result of float calculations based on list "x"
      return res
      }

      public float publicFun() {
         //some other operations on private list "list"
         return fun1(list);
      }

问题是如何使用Mockito,PowerMock或其他测试工具来测试功能publicFun() 要运行此公共功能,我必须模拟私有列表,但是我该怎么办呢?

在此示例中,由于不受欢迎的依赖关系而导致一些问题:

1个new Date()要解决它,我建议引入新的界面

interface CurrentTimeProvider {
    Date getCurrentDate();
}

实施是显而易见的(为简单起见,我跳过了它)

2 Is new ArrayList()

  • 您可以用自己的界面替换它(仅包含所需的方法)
  • 您可以模拟ArrayList本身
  • 您可以使用ArrayList的实际impl并对其进行完全测试

结果我们得到这样的东西:

class Some {
  private CurrentTimeProvider timeProvider;
  private ArrayList<SomeObject> list = new ArrayList<SomeObject>();

  public void setTimeProvider(CurrentTimeProvider timeProvider) {
      this.timeProvider = timeProvider;
  }

  public void addToList(Long t) {
      SomeObject so = new SomeObject(timeProvider.getCurrentDate(), t)
      list.add(so)
  } 

  public float publicFun() {
     //some other operations on private list "list"
     return fun1(list);
  }

并测试一下:

CurrentTimeProvider timeProvider = mock(CurrentTimeProvider.class);
Some some = new Some();
some.setTimeProvider(timeProvider);

when(timeProvider.getCurrentDate).thenReturn(mock(Date.class));

//Invoke you method
some.publicFun();

//Put assert and verify here

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM