我有一个关于如何在java中模拟一些调用的问题,例如,假设我有这个:
import whatever.package;
Class myClass extends otherClass {
public void myMethod() {
...
int a = methodCall();
...
}
}
问题是"methodCall()"来自包"anything.package",它是从"otherClass"继承而来的。有没有可能嘲笑它,让它返回我想要的任何int?
非常感谢!!
在评论中澄清后
如果它是继承的,您可以使用我提出的最后一个模式(测试扩展myClass),并简单地重写methodCall()
在这个答案中,我假设methodCall()是您拥有的另一个类的非静态方法。
让我们修改示例代码:
import whatever.package;
Class myClass
{
public void myMethod()
{
...
anotherClass aClass = new anotherClass();
int a = aClass.methodCall();
...
}
}
所以,现在我们想模拟另一个类的方法Call()。
正常的程序是使用接口并将"布线"推到其他地方,以避免紧密耦合。对依赖注入及类似概念进行了研究。
简而言之,使用new anotherClass()创建紧密耦合。您可以在myClass构造函数中或通过getter和setter注入另一个otherClass对象。我想你在写单元测试时需要嘲笑一下。考虑以下代码:
import whatever.package;
Class myClass
{
private IanotherClass another;
public void SetAnotherClass(IAnotherClass aClass)
{
another = aClass;
}
public void myMethod()
{
...
int a = another.methodCall();
...
}
}
测试代码:
myClass testedClass = new myClass();
testedClass.SetAnotherClass(new MyAnotherClassMock());
testedClass.myMethod();
至于针对接口而不是实现注入依赖关系和编程,这个主题有很多值得阅读的地方——只需谷歌一下!
如果你不想重新设计你的整个代码,只需要一个快速(而且有点脏)的修复,你可以考虑将创建另一个otherClass实例转移到单独的方法中,然后简单地让你的测试类从你的类继承,覆盖上面提到的方法(这并不总是可能的,这取决于你的实际代码)
示例:
Class myClass
{
public void myMethod()
{
...
IanotherClass aClass = GetAnotherClassInstance();
int a = aClass.methodCall();
...
}
protected IanotherClass GetAnotherClassInstance()
{
return new anotherClass();
}
}
Class MyTestClass extends myClass
{
@overwrite
protected IanotherClass GetAnotherClassInstance()
{
return new anotherClassMock();
}
}
然后只需使用myTestClass进行测试!
不重新设计代码?
模拟methodCall的类,并按类的顺序将其向上推。