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

时间:2015-12-09 15:33:19

标签: eclipse unit-testing mocking eclipse-rcp fixtures

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

我正在努力提高代码覆盖率并希望尽可能多地进行测试。简单案例(POJO)我已经学会了如何测试。但是,在某些情况下,我无法找到一个好的起点,特别是在创建灯具时。

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

我如何对此进行单元测试?我是否需要在模拟框架的帮助下模拟 ExecutionEvent

1 个答案:

答案 0 :(得分:3)

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

的讨论,请参见此处

由于可以在没有太多麻烦的情况下创建ExecutionEvent,因此我不会嘲笑它们。下面的代码段会创建一个可以传递给处理程序的事件。执行方法。

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工作台的情况,那么这是SWT Event(如果可用)。如果您的生产代码没有评估它,请保留null

在调用execute之前,您可能希望准备context

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

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

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