Testing Java实例化抽象类或部分实现的接口

Testing Java实例化抽象类或部分实现的接口,testing,mocking,abstract,instantiation,Testing,Mocking,Abstract,Instantiation,我有一个界面,有大约20个方法(巨大的) 我想为测试目的创建一个实例,但我只需要重写一个方法。使用重写方法获取此类实例的好方法是什么,而不必使用“//TODO:implementthis”方法定义整个类 模拟框架可能也能工作,但我可能更喜欢使用refection的东西。我可以创建一个模拟对象,但是我可以重写模拟对象中的方法吗?如果您对所有20个方法都有合理的默认行为,我建议创建一个实现接口的抽象类。这就是java.util API所做的。查看java.util.List和java.util.Ab

我有一个界面,有大约20个方法(巨大的)

我想为测试目的创建一个实例,但我只需要重写一个方法。使用重写方法获取此类实例的好方法是什么,而不必使用“//TODO:implementthis”方法定义整个类


模拟框架可能也能工作,但我可能更喜欢使用refection的东西。我可以创建一个模拟对象,但是我可以重写模拟对象中的方法吗?

如果您对所有20个方法都有合理的默认行为,我建议创建一个实现接口的抽象类。这就是java.util API所做的。查看
java.util.List
java.util.AbstractList
作为示例。

使用IDE-他们将为您添加缺少的实现方法

在eclipse中,如果创建类A实现I,则顶部会有一个红色标记,因为您尚未实现所有方法。然后你可以点击(或者右键点击,我忘了),它会为你做的

它仍有待办事项,但谁在乎呢


我不得不说,你的用例听起来有点奇怪。为什么您只测试一种方法?

要么这样,要么您就不必担心与您的测试用例无关的内容。在这种情况下,听起来20个方法中有19个是不会被调用的,那么除了让IDE/编辑器生成默认方法存根之外,为什么还要费事呢?

使用EasyMock类扩展框架的示例

被测类别:
public class TestClass {
 public boolean dir() {
  return new File("/user/a.txt").exists();
 }

public boolean hasFiles() { return dir(); }}
公共类TestClass{
公共布尔dir(){
返回新文件(“/user/a.txt”).exists();
}

公共布尔值文件(){ 返回dir(); }}

测试:

导入静态org.easymock.easymock.createMock;
导入静态org.easymock.easymock.expect;
导入静态org.easymock.easymock.replay

公开课考试{ 公共静态void main(字符串[]args)引发异常{ Class class1=TestClass.Class; TestClass mock=createMock(class1,class1.getMethod(“dir”); expect(mock.dir()).andReturn(true).times(2); expect(mock.dir()).andReturn(false).times(2); 重播(模拟)

System.out.println(“mock.dir()=”+mock.dir()); System.out.println(“mock.hasFiles()=”+mock.hasFiles())

System.out.println(“mock.dir()=”+mock.dir()); System.out.println(“mock.hasFiles()=”+mock.hasFiles()); } }

输出:
mock.dir()=true
mock.hasFiles()=true
mock.dir()=false

mock.hasFiles()=false

“什么是……的好方法”没有。必须有人定义缺失的方法来完成命名合同。智能IDE将为您生成所有缺少的方法存根,因此只需几次击键(或鼠标单击)即可。大概OP正在测试另一个组件,需要一个模拟方法参数——它必须是20方法接口的实例。@user268396在这种情况下,为什么不只是模拟?这是他建议的,但他不想这样做,因为他想实现其中一种方法。我想。。。

import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;

public class ATest { public static void main(String[] args) throws Exception { Class class1 = TestClass.class; TestClass mock = createMock(class1, class1.getMethod("dir")); expect(mock.dir()).andReturn(true).times(2); expect(mock.dir()).andReturn(false).times(2); replay(mock);

System.out.println("mock.dir()=" + mock.dir()); System.out.println("mock.hasFiles()=" + mock.hasFiles());

System.out.println("mock.dir()=" + mock.dir()); System.out.println("mock.hasFiles()=" + mock.hasFiles()); } }
mock.dir()=true
mock.hasFiles()=true
mock.dir()=false
mock.hasFiles()=false