Junit Mocking/Stubbing 方法 B 在方法 A 中(非参数化方法 A)

Junit Mocking/Stubbing method B inside method A (Non Parameterized method A)

我遇到了一个无法mock/stub方法的场景。

Class A{
   B b = new B();
   method aa(){
   ... call to method bb in class B
 }
}
Class B{
   method bb(){
     ......
   }
}

我想为 class B 模拟方法 bb。 由于 class A 的方法 aa 没有传递 b 的构造函数,我不确定如何模拟它的行为。

我试着嘲笑 B

A a = new A();
B b_mock = Mockito.mock(B.class);
when(b_mock.bb).thenReturn(..something);
a.aa();

但是在测试方法aa时它仍然在方法bb中,这是有道理的,因为A和b_mock之间没有关系。我不知道如何在 A 和 B 之间建立连接。

我试过 @InjectMock 也不起作用,我试图避免使用 powerMock。我不确定这是否可以实现。

提前致谢!

AB 紧密耦合,这使得很难单独对 A 进行单元测试。

如果您能够重构 A 以通过构造函数注入遵循显式依赖原则

public class A{
    private B b;
    public A(B b) {
        this.b = b;
    }

    public void aa(){
        //... call to method bb in class B
    }
}

您可以在测试时注入模拟

//Arrange
B b_mock = Mockito.mock(B.class);
A a = new A(b_mock);
when(b_mock.bb).thenReturn(..something);

//Act
a.aa();

//...

否则您将需要使用 PowerMock 来模拟 B 的初始化,不幸的是,这可能会导致紧密耦合的不良设计。