我正在使用mockito和testng为一个类编写测试。要测试的类有几个依赖项,需要进行模拟和注入。要测试的类具有以下配置文件
class A{
@Autowired
private Object1;
@Autowired
private Object2;
Object3 methodToBeTested (){
//some code
method2();
//some code
}
boolean method2(){
//some calls to Database that are not operational
}
}
在我的测试类中,我将对象Object1和Object2声明为模拟并将它们初始化为
@Mock
Object1 ob1;
@Mock
Object2 ob2;
@InjectMocks
A a = new A();
@Test
public void ATest(){
Object3 ob3;
when(ob1.someMethod()).thenReturn(someObject);
when(ob2.someMethos()).thenReturn(someOtherObject);
ob3 = a.methodToBeTested();
assertNotNull(ob3);
}
问题出现了,因为我必须模拟对A类的method2的调用,以及它有一些在测试阶段无法运行的调用。 mockito也不允许对象同时同时拥有@Mocks和@InjectMocks注释。有没有办法在不修改A类代码的情况下继续进行测试(不想仅仅为了测试而修改它)。
答案 0 :(得分:2)
你需要监视真正的A对象,如the documentation:
中所述@Mock
Object1 ob1;
@Mock
Object2 ob2;
@InjectMocks
A a = new A();
@Test
public void ATest(){
A spy = spy(a);
doReturn(true).when(spy).method2();
Object3 ob3;
when(ob1.someMethod()).thenReturn(someObject);
when(ob2.someMethos()).thenReturn(someOtherObject);
ob3 = spy.methodToBeTested();
assertNotNull(ob3);
}
请注意,这很有可能表明代码味道。 method2()
也许应该移到另一个A类依赖的类中。