Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对Eclipse命令处理程序进行单元测试?_Eclipse_Unit Testing_Mocking_Eclipse Rcp_Fixtures - Fatal编程技术网

如何对Eclipse命令处理程序进行单元测试?

如何对Eclipse命令处理程序进行单元测试?,eclipse,unit-testing,mocking,eclipse-rcp,fixtures,Eclipse,Unit Testing,Mocking,Eclipse Rcp,Fixtures,我有一个基于Eclipse3.x的应用程序,它使用命令和处理程序 我正在提高代码覆盖率,希望尽可能多地进行测试。我学会了如何测试的简单案例(POJO)。然而,在某些情况下,我找不到一个好的起点,尤其是在创建夹具时 例如:Eclipse命令处理程序。我有一个处理程序类MyHandler扩展org.eclipse.core.commands.AbstractHandler。它有一个方法public Object execute(ExecutionEvent事件)抛出ExecutionExceptio

我有一个基于Eclipse3.x的应用程序,它使用命令和处理程序

我正在提高代码覆盖率,希望尽可能多地进行测试。我学会了如何测试的简单案例(POJO)。然而,在某些情况下,我找不到一个好的起点,尤其是在创建夹具时

例如:Eclipse命令处理程序。我有一个处理程序类
MyHandler
扩展
org.eclipse.core.commands.AbstractHandler
。它有一个方法
public Object execute(ExecutionEvent事件)抛出ExecutionException
。通常,
事件
是从GUI中的用户操作传入的,例如,单击菜单项


如何进行单元测试?我是否需要借助模拟框架来模拟
ExecutionEvent

除非不可避免,否则我宁愿只模拟我拥有的类型。请参见此处以了解有关的讨论

由于
ExecutionEvent
s可以创建而无需太多麻烦,因此我不会嘲笑它们。下面的代码段创建了一个事件,您可以将其传递给处理程序的execute方法

ieevaluationcontext=newevaluationcontext(null,newobject());
映射参数=新的HashMap();
ExecutionEvent=新的ExecutionEvent(null,参数,null,上下文);
ExecutionEvent
构造函数的第一个参数引用了该命令-我从未使用过它。如果您的代码需要实际的命令,您可以使用
ICommandService
获取对您的命令的引用:

ICommandService命令服务=。。。
Command=commandService.getCommand(“id.of.my.Command”);
第二个参数是命令参数的映射。第三个参数是触发器。如果是Eclipse工作台,那么这就是SWT(如果可用)。如果生产代码未对其求值,则将其保留为空

在调用execute之前,您可能需要准备
上下文的变量:

context.addVariable(isosources.ACTIVE\u PART\u NAME,myPart);
context.addVariable(isosources.ACTIVE_CURRENT_SELECTION_NAME,new StructuredSelection());
请注意,
null
不允许作为变量值。忽略调用或-如果已添加,请使用
removevaluate()


如果您不需要命令(请参见上文),当然您的生产代码也不需要工作台,那么您甚至可以将测试作为普通JUnit测试运行(与PDE JUnit测试相反)。

谢谢。虽然我的问题中没有提到这一点,但您是否也可以提示如何在这样的测试中处理
activeWorkbenchWindow
?例如,我在某个时候使用了
HandlerUtil.getActiveWorkbenchWindow(event.close()
,这会抛出一个NPE…不确定这里的“进程”是什么意思。NPE是因为活动工作台窗口为
null
。要将它添加到测试上下文中,您需要编写
context.addVariable(isosources.ACTIVE\u WORKBENCH\u WINDOW\u NAME,PlatformUI.getWorkbench().getActiveWorkbenchWindow())
。如果您手头已经有一个工作台部件或类似部件,我建议从那里引用WorkbenchWindow,例如part.getSite().getPage().getWorkbenchWindow()