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

How can I unit test Eclipse Command Handlers?

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

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

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

如何对它进行单元测试?我需要在模拟框架的帮助下 mock ExecutionEvent 吗?

除非不可避免,否则我更喜欢只模拟我拥有的类型。有关 Should you only mock types you own?

的讨论,请参见此处

由于可以轻松创建 ExecutionEvents,所以我不会嘲笑它们。下面的代码片段创建了一个事件,您可以将其传递给处理程序的执行方法。

IEvaluationContext context = new EvaluationContext( null, new Object() );
Map<String, String> parameters = new HashMap<>();
ExecutionEvent event = new ExecutionEvent( null, parameters, null, context );

ExecutionEvent 构造函数的第一个参数引用了命令——我从来没有用过它。如果您的代码需要一个实际的命令,您可以使用 ICommandService 来获取对您的命令的引用:

ICommandService commandService = ...
Command command = commandService.getCommand( "id.of.my.command" );

第二个参数是命令参数的映射。第三个参数是触发器。如果是 Eclipse workbench,这是 SWT Event(如果可用)。如果您的生产代码不评估它,请保留它 null

在调用 execute 之前,您可能需要准备 context:

的变量
context.addVariable( ISources.ACTIVE_PART_NAME, myPart );
context.addVariable( ISources.ACTIVE_CURRENT_SELECTION_NAME, new StructuredSelection() );

请注意,null 不允许作为变量值。忽略调用或 - 如果已添加,请使用 removeVariable().

如果您不需要命令(见上文)- 当然您的生产代码不需要 workbench - 您甚至可以 运行 将测试作为普通 JUnit 测试(相对于 PDE JUnit 测试)。