如何对 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?
的讨论,请参见此处
由于可以轻松创建 ExecutionEvent
s,所以我不会嘲笑它们。下面的代码片段创建了一个事件,您可以将其传递给处理程序的执行方法。
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 测试)。
我有一个基于 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?
的讨论,请参见此处由于可以轻松创建 ExecutionEvent
s,所以我不会嘲笑它们。下面的代码片段创建了一个事件,您可以将其传递给处理程序的执行方法。
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 测试)。