Java 如何将模拟类传递给扩展类';Scala中的父构造函数是什么?

Java 如何将模拟类传递给扩展类';Scala中的父构造函数是什么?,java,scala,mockito,Java,Scala,Mockito,我必须在一些现有代码中添加一些功能,如 class A(foo: Foo, bar: Bar) { // stuff def aMethod(){ // some setup bMethod() } private def bMethod() { // do some stuff } } class ATest() {

我必须在一些现有代码中添加一些功能,如

    class A(foo: Foo, bar: Bar) {
        // stuff
        def aMethod(){
            // some setup
            bMethod()
        }

        private def bMethod() {
            // do some stuff
        }
    }

    class ATest() {
        val mockA = new ExtendsA(instance, foo, bar)
        val results = mockA.aMethod()
        // validate some stuff
    }
    class ExtendsA(instance: Instance, foo: Foo, bar: Bar) extends A(foo: Foo, bar: Bar) {
        // override some stuff
    }
我添加了一些必须在bMethod()期间执行的功能。这需要访问不受代码控制且在调试期间无法正确设置的数据,因此将其放入新类并模拟

    class MoreFunctionality() {}

    class A(foo: Foo, bar: Bar, moreFunctionality : MoreFunctionality = new MoreFunctionality()) {
        // stuff
        def aMethod(){
            // some setup
            bMethod()
        }

        private def bMethod() {
            moreFunctionality.doNewStuff()
            // do some stuff

        }
    }

    class ATest() {
        val mockMoreFunctionality = mock[MoreFunctionality]
        doNothing().when(mockMoreFunctionality).doNewStuff()
        val mockA = new ExtendsA(instance, foo, bar, mockMoreFunctionality)
        val results = mockA.aMethod()
        // validate some stuff
    }
    class ExtendsA(instance: Instance, foo: Foo, bar: Bar, mockMoreFunctionality: MoreFunctionality) extends A(foo, bar, mockMoreFunctionality) {
        // override some stuff
    }
我遇到的问题是,我尝试的一切似乎都忽略了MoreFunctional类已被模拟的事实,并试图使用实际的方法。我已经使用mockingDetails(obj).isMock()测试了该实例实际上是一个mock,它确实是

我还尝试重新安排它,使方法本身接受新类作为参数,但这也不起作用

    class MoreFunctionality() {}

    class A(foo: Foo, bar: Bar) {
        // stuff
        def aMethod(moreFunctionality: MoreFunctionality){
            // some setup
            bMethod(moreFunctionality)
        }

        private def bMethod(moreFunctionality: MoreFunctionality) {
            moreFunctionality.doNewStuff()
            // do some stuff

        }
    }

    class ATest() {
        val mockMoreFunctionality = mock[MoreFunctionality]
        doNothing().when(mockMoreFunctionality).doNewStuff()
        val mockA = new ExtendsA(instance, foo, bar)
        val results = mockA.aMethod(mockMoreFunctionality)
        // validate some stuff
    }
    class ExtendsA(instance: Instance, foo: Foo, bar: Bar) extends A(foo, bar) 
    {
        // override some stuff
    }

这里有我遗漏的东西吗?

doNewStuff的真正方法是否接受任何参数?如果是的话,你是怎么做的?另外,你不应该在模拟上使用
doNothing
,模拟默认情况下什么都不做,代码是用来覆盖spysSo上的行为的,我们最终解决了这个问题。问题是,扩展类A的类将类A的实例作为参数。该实例是一个模拟实例,正在从那里调用所使用的方法。因此,当我们在ExtendDSA中添加MockMore功能时,测试使用的是来自A的模拟的非模拟值。这一切都非常混乱,很可能设计得不好,但我们必须使添加的内容与存在的内容一起工作。