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。我不确定这是否可以实现。
提前致谢!
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
的初始化,不幸的是,这可能会导致紧密耦合的不良设计。
我遇到了一个无法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。我不确定这是否可以实现。
提前致谢!
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
的初始化,不幸的是,这可能会导致紧密耦合的不良设计。