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,所以我所能做的就是在类测试中使用我的存根,而不是他的方法。