我的代码中只有参数化的构造函数,我需要通过它注入(inject)。

我想监视参数化的构造函数,以将模拟对象作为对我的junit的依赖项注入(inject)。

public RegDao(){
 //original object instantiation here
Notification ....
EntryService .....
}

public RegDao(Notification notification , EntryService entry) {
 // initialize here
}

we have something like below :
RegDao dao = Mockito.spy(RegDao.class);

但是,我们是否可以在构造器中注入(inject)模拟对象并对其进行监视呢?

最佳答案

您可以通过在junit中使用参数化构造函数实例化您的主类,然后从中创建一个 spy 来做到这一点。

假设您的主类是A。其中BC是其依赖项

public class A {

    private B b;

    private C c;

    public A(B b,C c)
    {
        this.b=b;
        this.c=c;
    }

    void method() {
        System.out.println("A's method called");
        b.method();
        c.method();
        System.out.println(method2());

    }

    protected int method2() {
        return 10;
    }
}

然后,您可以使用参数化的类为此编写junit,如下所示
@RunWith(MockitoJUnitRunner.class)
public class ATest {

    A a;

    @Mock
    B b;

    @Mock
    C c;

    @Test
    public void test() {
        a=new A(b, c);
        A spyA=Mockito.spy(a);

        doReturn(20).when(spyA).method2();

        spyA.method();
    }
}

测试类别的输出
A's method called
20
  • 此处BC是您使用参数化构造函数注入(inject)类A中的模拟对象。
  • 然后我们创建了一个spyA,称为spyA
  • 我们通过修改类spy中的 protected 方法method2的返回值来检查A是否确实有效,如果spyA不是spy的实际A则不可能实现。
  • 10-04 13:13