【问题标题】:How to use mock of one class inside another to JUNIT test a void method for capturing arguments?如何在另一个类中使用一个类的模拟来 JUNIT 测试用于捕获参数的 void 方法?
【发布时间】:2019-01-09 09:41:20
【问题描述】:

这里我有一个实现method1的A类。

class A{
    public void method1(String name){
        classB b = new classB();
        // Some operations
        b.method2(argument1); 
    }
}

我想捕获传递给method2 的参数,我为此编写了以下代码。

我得到了错误,因为当我验证捕获以下代码中的参数时没有调用模拟。请让我知道如何通过调用模拟来捕获传递给method2的参数来成功执行此操作

class ATest{
    String name = "name";
    @Before
    public void setup{
        class A = new class A();
        class B = Mockito.mock(classB.class);
    }

    public void testmethod1()
    {
        A.method1(name);

        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);

        Mockito.verify(B, Mockito.times(1)).method2(captor.capture());

        String actual = captor.getValue();
        assertEquals("some data", actual);        
    }
}

【问题讨论】:

  • 你不能。因为A 的实例在调用method1 时会创建它们自己的classB 实例,所以您无权访问它。这不是可测试的设计。

标签: unit-testing junit mocking mockito


【解决方案1】:

Class B 必须是 Class A 的依赖项,您才能正确模拟它。或者它可以是一个参数。

Class A{
 public final B b;
 public A(B b){
  this.b = b
 }
 public void method1(String name){
  // Some operations
  b.method2(argument1); 
 }
}

然后在你实例化class A时在模拟中通过测试

class ATest{
    private B b;
    private A a;
    @Before
    public void setup{
     b = Mockito.mock(B.class);
     a = new A(b);
    }
    // tests...
}

【讨论】:

    猜你喜欢
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    相关资源
    最近更新 更多