1

我遇到了一个无法模拟/存根方法的场景。

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

我想为 B 类模拟方法 bb。由于 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。我不确定这是否可以实现。

提前致谢!

4

1 回答 1

3

A与 紧密耦合B,这使得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,尽管不幸的是,这可能会导致紧耦合的不良设计。

于 2018-10-01T00:16:23.790 回答