Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象能否调用重写的方法而不是其原始方法_Java_Unit Testing - Fatal编程技术网

Java 对象能否调用重写的方法而不是其原始方法

Java 对象能否调用重写的方法而不是其原始方法,java,unit-testing,Java,Unit Testing,如果我们有两个这样的类: public class A { public static int m=10; public int b(){ m++; return m;} public int fun() { return b(); } } public class Testfun() extends A { @Override public int b() {return 1;} public void test(){

如果我们有两个这样的类:

public class A {
   public static int m=10;
   public int b(){ m++; return m;}
   public int fun() {
     return b();
   }
}

public class Testfun() extends A {
    @Override 
    public int b() {return 1;}
    public void test(){
       A a = new A();    
       assertEquals(1,a.fun());
    }
}
有没有办法使类A中的方法
fun()
调用被重写的
b()
而不是它的超级
b()

这个想法是: 我想测试一下这个方法
fun()
,然后做一个存根
b()
。因此,我不希望该方法调用原始的
b()
并调用存根

有并没有办法让类A中的方法变得有趣()调用重写的b()而不是它的超级b()

不可能。您拥有的实例属于
A
类型,并且调用
A
中的方法。句号

有并没有办法让类A中的方法变得有趣()调用重写的b()而不是它的超级b()


不可能。您拥有的实例属于
A
类型,并且调用
A
中的方法。句号。

不,您不能调用。您拥有的实例是类型A和来自被调用对象的方法。

不,您不能调用。您拥有的实例是类型A和来自被调用对象的方法。

不,这是不可能的,因为对象不知道它有多少子对象,或者有多少子对象。当您想在类内测试某些内容并想对其进行存根时,需要使其成为类的依赖项,如下所示:

public class A {
   private final B b;

    public A(B b) {
        this.b = b;
    }

   public int fun() {
     return b.b();
   }
}

public interface B {
    int b();
}

public class Testfun() {

    public void test(){
       B b = new B {
         public int b() {
             return 1;
         }  
       };   
       A a = new A(b);   
       assertEquals(1, a.fun());
    }
}

在本例中,我们将B作为类A的依赖项,并能够将B从运行时的理想实现更改为测试中的测试虚拟。当您需要测试B本身时,您需要一个单独的类来测试B。请参见

不,这是不可能的,因为对象不知道它有多少个孩子,或者有多少孩子。当您想在类内测试某些内容并想对其进行存根时,需要使其成为类的依赖项,如下所示:

public class A {
   private final B b;

    public A(B b) {
        this.b = b;
    }

   public int fun() {
     return b.b();
   }
}

public interface B {
    int b();
}

public class Testfun() {

    public void test(){
       B b = new B {
         public int b() {
             return 1;
         }  
       };   
       A a = new A(b);   
       assertEquals(1, a.fun());
    }
}

在本例中,我们将B作为类A的依赖项,并能够将B从运行时的理想实现更改为测试中的测试虚拟。当您需要测试B本身时,您需要单独的类来测试B。请参见

谢谢大家,它真的帮助了我! 我的错误就在这里

       A a = new A();    
应该是:

       A a = new Testfun();

因此,将调用重写的
b()

谢谢大家,它真的帮助了我! 我的错误就在这里

       A a = new A();    
应该是:

       A a = new Testfun();

因此,将调用重写的
b()

为什么
A=newtestfun()
不起作用?您可以在
Testfun
中覆盖
b()
,然后呢?当然,如果您给它正确的返回类型,您发布的代码将很难用
void b(){return 1;}
编译。对于存根,请参见@daniu抱歉,我忘了将b()的返回类型修改为int而不是void。我现在编辑了,谢谢。我可以在不重写类中所有方法的情况下生成A=new Testfun()吗?不,在子类化时不需要重写所有方法。但是,在测试类和重写现有行为时,应该非常小心。非常感谢,这很有用。但是根据您的经验,除了覆盖方式之外,还有其他方法可以生成和调用存根吗?为什么
A=newtestfun()
不起作用?您可以在
Testfun
中覆盖
b()
,然后呢?当然,如果您给它正确的返回类型,您发布的代码将很难用
void b(){return 1;}
编译。对于存根,请参见@daniu抱歉,我忘了将b()的返回类型修改为int而不是void。我现在编辑了,谢谢。我可以在不重写类中所有方法的情况下生成A=new Testfun()吗?不,在子类化时不需要重写所有方法。但是,在测试类和重写现有行为时,应该非常小心。非常感谢,这很有用。但根据你的经验,除了覆盖方式之外,还有其他方法可以生成和调用存根吗?不在测试类中运行?上面的问题只是一个示例,但实际上我们不能修改开发人员代码,在这个示例中,开发人员代码是A类的,所以我所能做的就是在类测试中使用我的存根而不是他的方法。上面的问题只是一个示例但实际上,我们不能修改开发人员代码,在这个例子中,开发人员代码是类A,所以我所能做的就是在类测试中使用我的存根,而不是他的方法。