Our Eclipse-based product plugs into the platform debug support. And we have a
large number of launch shortcuts which have enablement expressions specified in
plugin.xml. And they are a huge pain in the ass to test manually. If a
particular shortcut is disabled when it should be enabled, there isn't a good
way (that I've seen) to trace the evaluation of the enablement expression at
runtime. So it comes down to stepping through the deeply nested
Expression.evaluate(..) calls, and you can easily get lost.
This is one of those times where I feel
like the light bulb should have gone on for me years ago. It turns out there is
a much easier way to test these things: by writing JUnit Plug-in Tests for
them.
What follows is some sample code to do
this. Since I'm testing the enablement of launch shortcuts, the configuration
elements are specific to that scenario, but you should be able to do this for
any expression that appears in a bundle's plugin.xml.
In
a @Before method, I read the expression from the plugin.xml and convert it into
an Expression object.
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.EXTENSION_POINT_LAUNCH_SHORTCUTS);
IConfigurationElement[] infos = extensionPoint.getConfigurationElements();
for (IConfigurationElement elem : infos) {
String id = elem.getAttribute("id");
IConfigurationElement contextLaunch = null;
IConfigurationElement enablement = null;
if ("myShortcutId".equals(id)) {
contextLaunch = elem.getChildren("contextualLaunch")[0];
enablement = contextLaunch.getChildren("enablement")[0];
expression = ExpressionConverter.getDefault().perform(enablement);
}
And in a @Test method, I set up the context
I'm trying to mimic and evaluate the expression.
@Test
public void ui() throws Exception {
List<object> ctxt = new ArrayList<object>();
ctxt.add(selectedObject /*Some IResource, perhaps*/);
IEvaluationContext context = new EvaluationContext(null, ctxt);
context.addVariable("selection", ctxt); //$NON-NLS-1$
assertEquals(EvaluationResult.valueOf(m_uiEnabled), expression.evaluate(context));
}
Now I can muck around in those delicately
constructed XML expressions and rest assured that I have a test suite watching
my back.
分享到:
相关推荐
Declarative Services(DS),在OSGi环境中,是一种声明式的方式来管理服务和组件的机制。它的核心思想是通过XML配置文件来定义服务的提供者和消费者,而不是通过代码直接引用和依赖其他服务,从而实现更加灵活和...
这些插件通过声明式服务(Declarative Services, DS)和扩展点(Extension Points)进行交互。 2. **源代码分析**:源代码包含了`index.html`,可能是书籍的目录或索引页面,`content.jar`和`artifacts.jar`可能...
书中会讲述如何使用Declarative Services(DS)和EMF(Eclipse Modeling Framework)来创建和管理模型。 7. **部署与打包**:最后,书籍会讨论如何打包和部署Eclipse RCP应用程序,包括使用Eclipse Product Export ...
这些插件通过声明式服务(Declarative Services, DS)和扩展点(Extension Points)相互连接,形成一个动态的、可扩展的系统。 二、插件项目创建 在Eclipse中,开发者可以使用“新建->其他->Eclipse插件项目”来...
8. **声明式服务(Declarative Services,DS)**:这是一种在Eclipse RCP中管理服务的机制,允许动态地激活和停用服务。 9. **RCP应用程序模型**:包括启动配置、产品配置和运行时环境,它们定义了RCP应用如何启动...
10. **扩展点和声明式服务(Extension Points and Declarative Services)**:扩展点是插件之间进行交互的接口,允许一个插件声明其提供的服务,另一个插件可以依赖这些服务。声明式服务简化了服务的注册和管理过程...
Eclipse 4 RCP使用依赖注入框架(如Equinox OSGi的Declarative Services),使得组件之间松耦合的连接成为可能。在UI层面,Eclipse 4 RCP引入了MVC的概念,支持声明式的UI布局和绑定。 接下来,让我们探讨如何搭建...
5. **声明式服务(Declarative Services, DS)**:DS是OSGi框架下的一种服务管理机制,它简化了服务的注册和发现。通过DS,开发者可以在XML配置文件中声明服务的提供者和消费者,增强了插件间的动态交互和依赖管理。...
"Pure Declarative Programming in Swift, Among Other Things"这个主题深入探讨了如何在Swift中实现这一概念,以及它与其他编程范式的对比。 在Swift中,声明式编程主要体现在Swift的API设计上,比如Swift的数组和...
7. **扩展点和声明性服务**:如何利用Eclipse的扩展点机制来实现插件之间的协作,以及使用声明性服务(Declarative Services)进行插件间的服务注册和发现。 8. **调试和测试插件**:介绍如何使用PDE的调试工具进行...
3. **声明式服务(Declarative Services, DS)**:这是一种现代的、基于XML的插件组件模型,用于管理插件之间的依赖关系。DS允许开发者声明插件需要的服务,并在运行时自动注入。 4. **插件元数据(Plugin Manifest...
书籍将解释如何在Eclipse RCP中实现MVC,并展示如何使用Declarative Services和Blueprints等服务来解耦组件。 4. **事件驱动编程**:Eclipse RCP中的事件处理是通过监听器和事件传递机制实现的。书籍会阐述如何有效...
同时,可以使用Spring的Declarative Services(DS)来管理OSGi服务。 4. 编写代码:按照OSGi的模块化原则编写代码,每个模块(bundle)应尽可能独立。同时,利用Spring的特性,如DI和AOP,实现业务逻辑。 5. 测试...
《声明式解析器:declarative-parser 0.1版本详解》 在当今的软件开发领域,解析器扮演着至关重要的角色,它们能够帮助我们处理和理解各种格式的数据,如XML、JSON、YAML等。开源项目"declarative-parser-0.1.zip...
在这个过程中,你会学习到如何使用Eclipse插件生命周期模型,包括声明式服务(Declarative Services)和扩展点(Extension Points)。 此外,章节中还会详细讲解RCP的用户界面设计,如创建自定义视图和编辑器,以及...
<declarative> 自定义元素以声明方式创建Shadow DOM 它应该与给出的建议紧密合作演示版安装使用安装组件:$ bower install declarative-shadow-dom --save 或 。用法如果需要,内置的导入自定义元素可扩展polyfill&...
1.Declarative Inspector检查选定的DOM元素的声明性视图模型属性(动作,ctx,数据,dataProvider,i18n,消息,onEvent)。 请参见声明性检查器示例的屏幕截图。 2.Declarative Tracer跟踪关键声明事件的执行流程...
### Python SQLAlchemy 的 Mapping 与 Declarative 详解 #### 一、引言 在 Python 开发领域中,SQLAlchemy 是一款强大的 ORM (Object Relational Mapper) 工具库,它为开发者提供了高级功能来实现 Python 类与...
首先,我们要理解`zope.testing`中的关键概念——`Declarative Testing`。这是一种声明式的方式来定义测试,使得测试代码更加简洁、可读性强。通过使用`class TestSomething(Testing)`这样的语法,我们可以轻松地...