Java 如何模拟在其中注入模拟的对象的方法

Java 如何模拟在其中注入模拟的对象的方法,java,testng,mockito,Java,Testng,Mockito,我正在使用mockito和testng为一个类编写测试。要测试的类有几个依赖项,这些依赖项需要模拟和注入。要测试的类具有以下配置文件 class A{ @Autowired private Object1; @Autowired private Object2; Object3 methodToBeTested (){ //some code method2(); //some code

我正在使用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,并如下所示初始化它们

@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类代码的情况下继续进行测试(不要为了测试而修改它)。

您需要监视真实的a对象,如中所述:


请注意,这很有可能指示代码气味。
method2()
可能应该被移动到另一个类中,A将依赖于该类。

@jbnize不想将此作为一个答案,以便我可以对其进行投票?显然,这是正确的。@DavidWallace Done。谢谢你让我不那么懒:)请投票表示代码气味。如果你需要监视,99%的情况下你需要重构你的code@SarthakNigam然后你应该接受答案,将你的问题标记为已回答。对不起,我不知道
@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);
}