java - 使用 ArrayList 私有(private)成员测试类

标签 java testing mockito

我有一个具有以下实现的 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()?要运行此公共(public)功能,我必须模拟私有(private)列表,但我该怎么做?

最佳答案

在这个例子中,有几个问题是由不受欢迎的依赖引起的:

1 新日期() 为了解决这个问题,我建议引入新界面

interface CurrentTimeProvider {
    Date getCurrentDate();
}

实现是显而易见的(为简洁起见,我跳过它)

2 是新的ArrayList()

  • 你可以用你自己的接口(interface)替换它(只包含方法你 需要)
  • 你可以模拟 ArrayList 本身
  • 您可以使用 ArrayList 的实际实现并完全测试它

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

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

关于java - 使用 ArrayList 私有(private)成员测试类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25491515/

相关文章:

java - Tomcat 无法找到我的 servlet

java - 在java中的多线程之间维护相同的同步数组列表

java - 使用反射从列表中获取对象

methods - 防止equals方法的 stub

unit-testing - Play Framework 2 scala specs2 mockito,如何编写模拟单元测试

java - 使用mockito进行登录页面Junit测试

java - 显示输出的特定数字//从 bigInteger 中删除 0

java - 陷入无限 While 循环(使用 switch 语句)

phpunit 只处理一个文件而不是多个

testing - 究竟什么是试车手?