簡體   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