在 Groovy 中创建模拟 JMX 服务器和 Bean
Creating Mock JMX Servers and Beans in Groovy
我们正在监视具有大量自定义 MBean 和属性的自定义应用程序。长期以来,我们一直在实验室中使用服务器进行功能测试,但现在我们想要创建不依赖于实际远程连接的适当单元测试。
就我自己而言,我根本无法弄清楚如何使用 Groovy JMX 构建器来启动本地 MBeanServer,并使用属性和操作列表公开本地 mbean。
有人愿意提供这样一个模型的例子吗?我为 jmxbuilder 找到的现有示例并没有让我到达那里,但看起来应该是可能的。
这是我使用的(Java 中的示例,而不是 Groovy...)
/**
* Creates a new visible MBeanServer
* @param name The MBeanServer's default domain name
* @param xregPlatform true to register all known PlatformManagedObject in the created MBeanServer, false otherwise
* @return the new MBeanServer
*/
public static synchronized MBeanServer createMBeanServer(final String name, final boolean xregPlatform) {
MBeanServer mbs = getLocalMBeanServer(name);
if(mbs==null) {
mbs = MBeanServerFactory.createMBeanServer(name);
}
if(xregPlatform) {
registerPlatformManagedObjects(mbs);
}
return mbs;
}
有关其他方法的详细信息,请参阅我的 JMXHelper。
Spock 测试的一个简单示例
- 将 groovy bean 导出到 JMX
- 导入并使用这个 bean
代码:
class JMXSpec extends Specification {
class MyBean {
def property
}
def "launch and test a mbean"() {
given: "a mbean exported"
def jmx = new JmxBuilder()
jmx.export {
// Export every properties/methods of 'MyBean'
// under 'Groovy.Test:name=MyBean'
bean(
target:new MyBean(property:"test"),
name:"Groovy.Test:name=MyBean"
)
}
and: "a mbean imported from the local server"
def mbean = new GroovyMBean(ManagementFactory.getPlatformMBeanServer(),
"Groovy.Test:name=MyBean")
expect:
"test" == mbean.Property
}
}
此外,为了后代,这里是一个模仿常见 "queryNames" 方法的略微修改的示例...
import groovy.jmx.builder.JmxBuilder
import spock.lang.Specification
import javax.management.ObjectName
import java.lang.management.ManagementFactory
class SandboxJmxBuilderSpec extends Specification {
class MyBean {
def property
}
def "launch and test a mbean"() {
given: "a mbean exported"
def jmx = new JmxBuilder()
jmx.export {
// Export every properties/methods of 'MyBean'
// under 'Groovy.Test:name=MyBean'
bean(
target:new MyBean(property:"test"),
name:"Groovy.Test:name=MyBean"
)
}
and: "a mbean imported from the local server"
def mbs = ManagementFactory.getPlatformMBeanServer()
def queryString = "Groovy.Test:name=MyBean"
def discovery = mbs.queryNames(new ObjectName(queryString), null)
expect:
"test" == new GroovyMBean(mbs, discovery[0]).Property
}
}
我们正在监视具有大量自定义 MBean 和属性的自定义应用程序。长期以来,我们一直在实验室中使用服务器进行功能测试,但现在我们想要创建不依赖于实际远程连接的适当单元测试。
就我自己而言,我根本无法弄清楚如何使用 Groovy JMX 构建器来启动本地 MBeanServer,并使用属性和操作列表公开本地 mbean。
有人愿意提供这样一个模型的例子吗?我为 jmxbuilder 找到的现有示例并没有让我到达那里,但看起来应该是可能的。
这是我使用的(Java 中的示例,而不是 Groovy...)
/**
* Creates a new visible MBeanServer
* @param name The MBeanServer's default domain name
* @param xregPlatform true to register all known PlatformManagedObject in the created MBeanServer, false otherwise
* @return the new MBeanServer
*/
public static synchronized MBeanServer createMBeanServer(final String name, final boolean xregPlatform) {
MBeanServer mbs = getLocalMBeanServer(name);
if(mbs==null) {
mbs = MBeanServerFactory.createMBeanServer(name);
}
if(xregPlatform) {
registerPlatformManagedObjects(mbs);
}
return mbs;
}
有关其他方法的详细信息,请参阅我的 JMXHelper。
Spock 测试的一个简单示例
- 将 groovy bean 导出到 JMX
- 导入并使用这个 bean
代码:
class JMXSpec extends Specification {
class MyBean {
def property
}
def "launch and test a mbean"() {
given: "a mbean exported"
def jmx = new JmxBuilder()
jmx.export {
// Export every properties/methods of 'MyBean'
// under 'Groovy.Test:name=MyBean'
bean(
target:new MyBean(property:"test"),
name:"Groovy.Test:name=MyBean"
)
}
and: "a mbean imported from the local server"
def mbean = new GroovyMBean(ManagementFactory.getPlatformMBeanServer(),
"Groovy.Test:name=MyBean")
expect:
"test" == mbean.Property
}
}
此外,为了后代,这里是一个模仿常见 "queryNames" 方法的略微修改的示例...
import groovy.jmx.builder.JmxBuilder
import spock.lang.Specification
import javax.management.ObjectName
import java.lang.management.ManagementFactory
class SandboxJmxBuilderSpec extends Specification {
class MyBean {
def property
}
def "launch and test a mbean"() {
given: "a mbean exported"
def jmx = new JmxBuilder()
jmx.export {
// Export every properties/methods of 'MyBean'
// under 'Groovy.Test:name=MyBean'
bean(
target:new MyBean(property:"test"),
name:"Groovy.Test:name=MyBean"
)
}
and: "a mbean imported from the local server"
def mbs = ManagementFactory.getPlatformMBeanServer()
def queryString = "Groovy.Test:name=MyBean"
def discovery = mbs.queryNames(new ObjectName(queryString), null)
expect:
"test" == new GroovyMBean(mbs, discovery[0]).Property
}
}