方法A内部的Junit模拟/存根方法B(非参数化方法A)

时间:2018-10-01 00:03:03

标签: java unit-testing junit mockito spy

我遇到了无法模拟/添加方法的情况。

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。我不确定这是否可以实现。

谢谢!

1 个答案:

答案 0 :(得分:3)

BA紧密耦合,这使得难以单独进行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();

//...

您可以在测试时注入模拟

B

否则,您将需要使用PowerMock模拟my_str (str): The string to be modified. ranges (list): A list of [start, end] indices. 的初始化,不幸的是,这可能会鼓励紧密耦合的不良设计。