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