我有一个关于如何在
java中模拟一些调用的问题,例如,想象我有这个:
import whatever.package;
Class myClass extends otherClass {
public void myMethod() {
...
int a = methodCall();
...
}
}
问题是“methodCall()”来自包“whatever.package”,它继承自“otherClass”.是否可以模拟它以便返回我想要的任何int?
非常感谢!!
最佳答案 在评论澄清后
如果它继承了,你可以使用我提出的最后一个模式(测试扩展myClass)并简单地覆盖methodCall()
在这个答案中,我假设methodCall()是您拥有的另一个类的非静态方法.
让我们修改示例代码:
import whatever.package;
Class myClass
{
public void myMethod()
{
...
anotherClass aClass = new anotherClass();
int a = aClass.methodCall();
...
}
}
所以,现在我们要模拟另一个类的methodCall().
正常的程序是使用接口并将“接线”推到其他地方,以避免紧密耦合.对Dependancy Injection和类似概念进行一些研究.
简而言之,使用new anotherClass()可以创建紧耦合.您可以在myClass构造函数中或通过getter和setter注入anotherClass对象.我认为你需要嘲笑写单元测试.请考虑以下代码:
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();
至于注入依赖关系和编程对接口,而不是实现,有很多东西要阅读这个主题 – 只是google它!
如果您不想重新设计整个代码并且只需要快速(并且有点脏)修复,您可以考虑将创建anotherClass实例移动到单独的方法中,然后让您的测试类继承自您的类,覆盖提到的方法(这永远不可能 – 一切都取决于你的实际代码)
例:
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进行测试!