Java 如何监视属于无法从外部访问的对象的方法?

Java 如何监视属于无法从外部访问的对象的方法?,java,unit-testing,mocking,mockito,Java,Unit Testing,Mocking,Mockito,我对莫基托很陌生,我遇到了一个无法解决的情况。我想用Mockito测试一个方法。问题是,在这个方法中,创建了一个对象,这个对象有一个我想要模拟的函数 例如,下面是一个小示例代码,它说明了我的问题: public class ClassA { public functionDoingDBStuff() { //........... } } public class ClassB { final ClassA classAObj = null;

我对莫基托很陌生,我遇到了一个无法解决的情况。我想用Mockito测试一个方法。问题是,在这个方法中,创建了一个对象,这个对象有一个我想要模拟的函数

例如,下面是一个小示例代码,它说明了我的问题:

public class ClassA {
    public functionDoingDBStuff() {
        //...........
    }
}

public class ClassB {
    final ClassA classAObj = null;

    public functionXYZ() {
        classAObj = new ClassA();

        classAObj.functionDoingDBStuff();
    }
}


@Test
MyTestFunction() {
    ClassB classBObj = new ClassB();

    // How can I access and mock functionDoingDBStuff() here?
}

因此,在
MyTestFunction()
中,我想测试
functionXYZ()
,但模拟在
functionXYZ()中调用的函数
functionDoingDBStuff()
。通过mock,我的意思是返回我希望用于测试的特定结果。但是,函数
functiondoingdbstaff()
属于在
functionXYZ()
中创建的对象,因此我不知道如何告诉Mockito从
MyTestFunction()中访问它。我希望您能够理解我的意思。

如果一段代码无法轻松测试,这表明代码的结构存在问题,请告诉我。无论如何,为什么需要在
函数xyz
中执行
新ClassA()
?不能在对象级别实例化(更好的是注入)?如果是这样,您可以注入ClassA的模拟实例


如果它仍然必须在方法中实例化,可能不是执行
newclassa()
,它应该包装在工厂方法中。然后,如果一段代码不能很容易地进行测试,这表明代码的结构存在问题,那么您可以模拟工厂,将模拟
ClassA

返回给我。无论如何,为什么需要在
函数xyz
中执行
新ClassA()
?不能在对象级别实例化(更好的是注入)?如果是这样,您可以注入ClassA的模拟实例


如果它仍然必须在方法中实例化,可能不是执行
newclassa()
,它应该包装在工厂方法中。然后可以模拟工厂以返回模拟
ClassA

这就是对象不应该自己创建依赖项的原因。使用代替。考虑不要嘲笑<代码> ClassA < /代码>。注意:不需要模拟。这就是为什么对象不应该自己创建依赖项的原因。使用代替。考虑不要嘲笑<代码> ClassA < /代码>。注:不需要模拟。