在评论中澄清之后
如果它继承,您可以使用我提出的最后一个模式(测试扩展 myClass)并简单地覆盖 methodCall()
在这个答案中,我假设 methodCall() 是您拥有的另一个类的非静态方法。
让我们修改示例代码:
import whatever.package;
Class myClass
{
public void myMethod()
{
...
anotherClass aClass = new anotherClass();
int a = aClass.methodCall();
...
}
}
所以,现在我们要模拟出另一个类的methodCall()。
正常的程序是使用接口并将“接线”推到其他地方,以避免紧密耦合。对依赖注入和类似概念进行一些研究。
简而言之,使用 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();
至于注入依赖项和针对接口而不是实现进行编程,关于该主题有很多要阅读的内容 - 只需谷歌它!
如果您不想重新设计整个代码并且只需要快速(并且有点脏)修复,您可以考虑将创建 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 进行测试!