【问题标题】:Object creation mocking mockito对象创建模拟模拟
【发布时间】:2018-05-03 13:13:27
【问题描述】:

我有一个班级顶部和底部。我想对创建底部对象的原子类进行单元测试。

public class top {

  publiv top() {
     bottom b = new bottom("value");
  }
}

单元测试类:

public class topTest {
   @Test
   public void test(){ 
     top a = new top();
   }
}

在测试中为顶层类创建对象时,它会为底层类创建一个对象。

在这里,我想模拟底层对象的创建。谁能帮我解决这个问题。

【问题讨论】:

    标签: java android unit-testing mocking mockito


    【解决方案1】:

    为此,您应该考虑将底部对象作为参数传递。当对象依赖于该对象时,将对象作为参数传递始终是一个好习惯。

    public class Top {
       private Bottom bottom;
    
       public Top(Bottom bottom) {
          this.bottom = bottom
       }
    }
    
    public class TopTest {
       @Test
       public void test(){ 
          Bottom bottom = mock(Bottom.class);
          Top top = new Top(bottom);
       }
    }
    

    【讨论】:

      【解决方案2】:

      您需要将创建底部实例的逻辑移动到某处。要么在一个可覆盖的方法中,比如:

      public class top {
      
        public top() {
           bottom b = new bottom("value");
        }
      
        protected bottom createBottom() {
           return new bottom("value");
        }
      }
      

      然后你可以在测试中覆盖它:

      public class topTest {
         @Test
         public void test(){ 
           top a = new top() {
                  protected bottom createBottom() {
                     return Mockito.mock(bottom.class);
                   }   
                   };
         }
      }
      

      或者您创建一个 BottomCreator 类,在构建时将其传递给 Top,并在测试时使用模拟/伪造版本。

      public class top {
      
            private final BottomCreator bottomCreator;
      
            public top(BottomCreator creator) {
                 this.bottomCreator = creator;
            }
      
            public top() {
               bottom b = bottomCreator.newBottom();
            }
      
          }
      

      【讨论】:

      • 为什么要传递底部创建者作为构造函数参数而不是传递底部实例?
      • 我猜这取决于语义。也许底部必须/应该在顶部创建,我试图提出一个建议,尽可能少地改变原始问题中描述的机制。但它也可以通过传递来工作。
      猜你喜欢
      • 2017-04-07
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2010-11-27
      相关资源
      最近更新 更多