【问题标题】:How can I unit test Eclipse Command Handlers?如何对 Eclipse 命令处理程序进行单元测试?
【发布时间】:2015-12-09 15:33:19
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    除非不可避免,我更喜欢只模拟我拥有的类型。有关Should you only mock types you own?的讨论,请参见此处

    因为ExecutionEvents 可以轻松创建,所以我不会嘲笑它们。下面的 sn-p 创建一个事件,您可以将其传递给处理程序的 execute 方法。

    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 测试)运行。

    【讨论】:

    • 谢谢。尽管我的问题中没有提到这一点,但您能否也暗示如何在这样的测试中处理 activeWorkbenchWindow ?例如,我在某些时候使用HandlerUtil.getActiveWorkbenchWindow(event).close(),这会引发 NPE...
    • 不确定这里的“过程”是什么意思。 NPE 是因为活动的 WorkbenchWindow 是null。要将其添加到您的测试上下文中,您可以编写 context.addVariable( ISources.ACTIVE_WORKBENCH_WINDOW_NAME, PlatformUI.getWorkbench().getActiveWorkbenchWindow() )。如果您手头已有工作台部件或类似部件,我建议您从那里引用 WorkbenchWindow,例如part.getSite().getPage().getWorkbenchWindow()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2021-07-01
    • 2011-08-22
    • 1970-01-01
    • 2013-10-24
    相关资源
    最近更新 更多