如何模拟注入模拟的对象的方法

时间:2015-10-19 08:10:30

标签: java testng mockito

我正在使用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类代码的情况下继续进行测试(不想仅仅为了测试而修改它)。

1 个答案:

答案 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类依赖的类中。