<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>解惑 &#187; 测试</title>
	<atom:link href="http://www.jiehoo.me/tag/%e6%b5%8b%e8%af%95/feed" rel="self" type="application/rss+xml" />
	<link>http://www.jiehoo.me</link>
	<description>解己之惑，解人之惑</description>
	<lastBuildDate>Mon, 19 Jul 2010 10:01:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>测试框架</title>
		<link>http://www.jiehoo.me/%e6%b5%8b%e8%af%95%e6%a1%86%e6%9e%b6.htm</link>
		<comments>http://www.jiehoo.me/%e6%b5%8b%e8%af%95%e6%a1%86%e6%9e%b6.htm#comments</comments>
		<pubDate>Wed, 30 Jun 2010 07:59:28 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[框架]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=1029</guid>
		<description><![CDATA[最近在做C#版的测试框架，目的其实是让QA不用写代码就可以测试API，QA需要写一些XML，然后交给这个测试框架运行。 设计其实比较直接，把功能测试中的一些概念抽取出来包装下就可以了，XML要人可读可写，然后能够直接转换为对应的类，免去解析的过程最好。 我提取出来的主要概念如下： Library，对应的其实就是DLL，就像java中的jar一样，可以从指定的路径load，也可以从系统的GAC（windows特定的东西）里面load。 Instance，其实本来想叫Object，因为是关键字，只能取这个比较紧似的名字，另外，声明的也确实是对象的instance而不是对象定义。 List，集合类型，可以当成List或者Array用。 WebService，这个是Instance的子类可能有点怪，但是框架的工作机制是生成WebService的Stub的对应的类，所以其实也是Instance，只是有一些额外的属性。 Operation，其实就是操作了，有很多子类型： Method，就是方法调用了 Verify，主要是为了做结果验证，其实也是Method，只不过掩盖了实现，我用的就是NUit的实现。 Task，Operation的集合，本来想加一个Function的，但是感觉Function和Task功能完全一样。Task就相当于功能测试或者单元测试的一个方法。 Express，表达式，主要是为了支持简单的字符串连接和数学运算。 Field，获取或者设置Instance的field，我掩盖了C#中的Property和Field的区别，只提供Field，两种都可以访问。 Loop，其实也是Operation的集合，但是会把集合中的Operation重复执行很多次，用于性能测试或者批量调用，会生成一个索引值供Operation引用生成不同的值。 Indexer，访问集合类型中的某个指定下标的元素，主要是因为C#没有像Java一样提供Get(int index)方法，否则这个完全没有，直接用Method 就可以实现了。 Finder，主要是简化了从集合类型中查找某个元素，框架没有提供if/else这样的逻辑控制，只能提供这个变向的方式。 Wait，主要是提供Sleep以及异步调用支持，是Verify的子类型，可以每隔一段时间Verify一下，看看结果是不是match，然后有超时，超时就认为Veirfy失败。 Define，就是组件声明，里面包含的就是上面提到的那些东西。 Suite，就是Test Case了，包含Define列表和Task列表，以及Startup/Teardown 基本上已经涵盖测试中需要的大部分内容了。 一些额外的想法，Operation还是有很大扩展余地的，例如可以支持外部调用，例如调用一个命令行或者其它的程序。]]></description>
			<content:encoded><![CDATA[<p class='fp'>最近在做C#版的测试框架，目的其实是让QA不用写代码就可以测试API，QA需要写一些XML，然后交给这个测试框架运行。</p>
<p>设计其实比较直接，把功能测试中的一些概念抽取出来包装下就可以了，XML要人可读可写，然后能够直接转换为对应的类，免去解析的过程最好。</p>
<p>我提取出来的主要概念如下：</p>
<ul>
<li>Library，对应的其实就是DLL，就像java中的jar一样，可以从指定的路径load，也可以从系统的GAC（windows特定的东西）里面load。</li>
<li>Instance，其实本来想叫Object，因为是关键字，只能取这个比较紧似的名字，另外，声明的也确实是对象的instance而不是对象定义。
<ul>
<li>List，集合类型，可以当成List或者Array用。</li>
<li>WebService，这个是Instance的子类可能有点怪，但是框架的工作机制是生成WebService的Stub的对应的类，所以其实也是Instance，只是有一些额外的属性。</li>
</ul>
</li>
<li>Operation，其实就是操作了，有很多子类型：
<ul>
<li>Method，就是方法调用了</li>
<li>Verify，主要是为了做结果验证，其实也是Method，只不过掩盖了实现，我用的就是NUit的实现。</li>
<li>Task，Operation的集合，本来想加一个Function的，但是感觉Function和Task功能完全一样。Task就相当于功能测试或者单元测试的一个方法。</li>
<li>Express，表达式，主要是为了支持简单的字符串连接和数学运算。</li>
<li>Field，获取或者设置Instance的field，我掩盖了C#中的Property和Field的区别，只提供Field，两种都可以访问。</li>
<li>Loop，其实也是Operation的集合，但是会把集合中的Operation重复执行很多次，用于性能测试或者批量调用，会生成一个索引值供Operation引用生成不同的值。</li>
<li>Indexer，访问集合类型中的某个指定下标的元素，主要是因为C#没有像Java一样提供Get(int index)方法，否则这个完全没有，直接用Method 就可以实现了。</li>
<li>Finder，主要是简化了从集合类型中查找某个元素，框架没有提供if/else这样的逻辑控制，只能提供这个变向的方式。</li>
<li>Wait，主要是提供Sleep以及异步调用支持，是Verify的子类型，可以每隔一段时间Verify一下，看看结果是不是match，然后有超时，超时就认为Veirfy失败。</li>
</ul>
</li>
<li>Define，就是组件声明，里面包含的就是上面提到的那些东西。</li>
<li>Suite，就是Test Case了，包含Define列表和Task列表，以及Startup/Teardown</li>
</ul>
<p>基本上已经涵盖测试中需要的大部分内容了。</p>
<p>一些额外的想法，Operation还是有很大扩展余地的，例如可以支持外部调用，例如调用一个命令行或者其它的程序。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/%e6%b5%8b%e8%af%95%e6%a1%86%e6%9e%b6.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>INTJ</title>
		<link>http://www.jiehoo.me/intj.htm</link>
		<comments>http://www.jiehoo.me/intj.htm#comments</comments>
		<pubDate>Mon, 29 Jun 2009 03:33:38 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[人生]]></category>
		<category><![CDATA[INTJ]]></category>
		<category><![CDATA[测试]]></category>
		<category><![CDATA[性格]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/intj.htm</guid>
		<description><![CDATA[今天又做了下性格测试，得出的结论是INTJ，网上的解释是看起来和我还是蛮匹配的： 对INTJ性格人群来说，最重要的是独立自主以及能够根据他们的标准来生活。对别人来说，INTJ人群似乎可能制造了一种自信的气氛。这种自信被那些缺少判断力的人来说是一种毫无经验的自大而已。 &#160;&#160; 这种自信源于的知系，而大多的INTJ人群从很早就开始建立这种自信了。当问题是来自于他们的专业领域，&#8211;并且INTJ人群可能分布在各个领域-他们可 以几乎是立即告诉你，无论他们是否可以帮助你，如果可以,他们会告诉你怎么做。INTJ人群知道自己知道些什么，更重要的的是他们知道自己不知道什么。 &#160;&#160;&#160; INTJ人群是完美主义者，他们看似有着永无止境的能力去改善任何他们感兴趣的事物。防止他们习惯性的陷入追求这种完美的是INTJ人群的性格特有的实用 主义：INTJ人群适用（冷酷）的标准&#34;这有用吗？&#34;对任何来自于盛行的社会模式以及在他们自己研究成就的事物。 &#160;&#160;&#160; INTJ这类型的人群被誉为&#34;系统的建设者&#34;，可能部分因为他们拥有不寻常的集合虚幻性和确定性的显著特点。无论在何种体系下工作，对INTJ人群来说在 思想中是一样的,只因为他们是拥有INTJ性格的人群。完美主义并且藐视权威可能会在现实生活中体现，所以对INTJ人群来说他们可以在一个项目中对自己 和他人毫不留情。任何&#34;松懈的&#34;人，包括上司，将会失去INTJ人群对他们的尊敬-并且通常INTJ人群会让他们意识到这一点。INTJ人群也是可以作出 重大决定而不需询问他们的上司或同事的人群。另一个方面，他们能够小心谨慎公平地将一个项目中的个人贡献分清。他们天生具有抓住机遇的天赋，而有些机遇甚 至其他人都没有注意到。 &#160;&#160;&#160; 在最广泛的条件下，INTJ人群所做的一般是他们知道的。典型的INTJ人群择业的方向是在科学和工程方面的，但是他们也可能致力于那些需要智慧与犀利言 辞并重的领域（例如，律师，学术界的某些领域）。，如果他们愿意花时间去扩展他们的能力，INTJ人群可以从事管理，（无论是出于个人的野心或愿望）很多 INTJ人群觉得学习如何假意的因循守旧是很有利的，因为这可以在某种程度上掩饰他们内在的异常性格而在处理个人关系，特别是在爱情方面，他们缺乏罗曼蒂克，这对INTJ人群来说是致命的弱点。INTJ人群不乐意领会社会的礼仪；例如，他们很少有耐心并且 理解那些调情（大多数性格类型的人群被认为有一半的对这种关系有兴趣）。对于复杂的事，INTJ人群通常是那种特别自我的人群，他们很习惯的表现出冷漠， 而这一点容易被其他人误解。 对INTJ人群的描述 独立、冷僻、聪明；富有想象力、具有创新意识，独特的；吹毛求疵、善于分析、理智；知性上的好奇、有干劲的去学习和提高自身的能力与知识；在交际方面警惕而有所保留的；明确而有组织的。]]></description>
			<content:encoded><![CDATA[<p class='fp'>今天又做了下性格测试，得出的结论是INTJ，网上的解释是看起来和我还是蛮匹配的：</p>
<p>对INTJ性格人群来说，最重要的是独立自主以及能够根据他们的标准来生活。对别人来说，INTJ人群似乎可能制造了一种自信的气氛。这种自信被那些缺少判断力的人来说是一种毫无经验的自大而已。</p>
<p>&nbsp;&nbsp; 这种自信源于的知系，而大多的INTJ人群从很早就开始建立这种自信了。当问题是来自于他们的专业领域，&#8211;并且INTJ人群可能分布在各个领域-他们可 以几乎是立即告诉你，无论他们是否可以帮助你，如果可以,他们会告诉你怎么做。INTJ人群知道自己知道些什么，更重要的的是他们知道自己不知道什么。</p>
<p>&nbsp;&nbsp;&nbsp; INTJ人群是完美主义者，他们看似有着永无止境的能力去改善任何他们感兴趣的事物。防止他们习惯性的陷入追求这种完美的是INTJ人群的性格特有的实用 主义：INTJ人群适用（冷酷）的标准&quot;这有用吗？&quot;对任何来自于盛行的社会模式以及在他们自己研究成就的事物。</p>
<p>&nbsp;&nbsp;&nbsp; INTJ这类型的人群被誉为&quot;系统的建设者&quot;，可能部分因为他们拥有不寻常的集合虚幻性和确定性的显著特点。无论在何种体系下工作，对INTJ人群来说在 思想中是一样的,只因为他们是拥有INTJ性格的人群。完美主义并且藐视权威可能会在现实生活中体现，所以对INTJ人群来说他们可以在一个项目中对自己 和他人毫不留情。任何&quot;松懈的&quot;人，包括上司，将会失去INTJ人群对他们的尊敬-并且通常INTJ人群会让他们意识到这一点。INTJ人群也是可以作出 重大决定而不需询问他们的上司或同事的人群。另一个方面，他们能够小心谨慎公平地将一个项目中的个人贡献分清。他们天生具有抓住机遇的天赋，而有些机遇甚 至其他人都没有注意到。</p>
<p>&nbsp;&nbsp;&nbsp; 在最广泛的条件下，INTJ人群所做的一般是他们知道的。典型的INTJ人群择业的方向是在科学和工程方面的，但是他们也可能致力于那些需要智慧与犀利言 辞并重的领域（例如，律师，学术界的某些领域）。，如果他们愿意花时间去扩展他们的能力，INTJ人群可以从事管理，（无论是出于个人的野心或愿望）很多 INTJ人群觉得学习如何假意的因循守旧是很有利的，因为这可以在某种程度上掩饰他们内在的异常性格而在处理个人关系，特别是在爱情方面，他们缺乏罗曼蒂克，这对INTJ人群来说是致命的弱点。INTJ人群不乐意领会社会的礼仪；例如，他们很少有耐心并且 理解那些调情（大多数性格类型的人群被认为有一半的对这种关系有兴趣）。对于复杂的事，INTJ人群通常是那种特别自我的人群，他们很习惯的表现出冷漠， 而这一点容易被其他人误解。 </p>
<p>对INTJ人群的描述<br />
独立、冷僻、聪明；富有想象力、具有创新意识，独特的；吹毛求疵、善于分析、理智；知性上的好奇、有干劲的去学习和提高自身的能力与知识；在交际方面警惕而有所保留的；明确而有组织的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/intj.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>性能测试</title>
		<link>http://www.jiehoo.me/%e6%80%a7%e8%83%bd%e6%b5%8b%e8%af%95.htm</link>
		<comments>http://www.jiehoo.me/%e6%80%a7%e8%83%bd%e6%b5%8b%e8%af%95.htm#comments</comments>
		<pubDate>Mon, 23 Mar 2009 02:35:45 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Annotation]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[测试]]></category>
		<category><![CDATA[性能]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/%e6%80%a7%e8%83%bd%e6%b5%8b%e8%af%95.htm</guid>
		<description><![CDATA[上周基于JUnit写了个简单的性能测试框架，其实就是用了下Annotation，发现还是很好用的。 /** &#160;* Performance test annotation. &#160;*/ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface PerformanceTest { &#160;&#160;&#160; public String name() default &#34;&#34;; &#160;&#160;&#160; public int times(); &#160;&#160;&#160; public boolean stopOnError() default false; } /** &#160;* Base function for performance test. &#160;*/ public class BasePerformanceTest { &#160;&#160;&#160; protected Logger logger = Logger.getLogger(this.getClass()); &#160;&#160;&#160; List&#60;PerformanceData&#62; performanceData = new ArrayList&#60;PerformanceData&#62;(); [...]]]></description>
			<content:encoded><![CDATA[<p class='fp'>上周基于JUnit写了个简单的性能测试框架，其实就是用了下Annotation，发现还是很好用的。</p>
<p>/**<br />
&nbsp;* Performance test annotation.<br />
&nbsp;*/<br />
@Target(ElementType.METHOD)<br />
@Retention(RetentionPolicy.RUNTIME)<br />
@Documented<br />
public @interface PerformanceTest<br />
{<br />
&nbsp;&nbsp;&nbsp; public String name() default &quot;&quot;;<br />
&nbsp;&nbsp;&nbsp; public int times();<br />
&nbsp;&nbsp;&nbsp; public boolean stopOnError() default false;<br />
}</p>
<p>
<span id="more-687"></span> /**<br />
&nbsp;* Base function for performance test.<br />
&nbsp;*/<br />
public class BasePerformanceTest<br />
{<br />
&nbsp;&nbsp;&nbsp; protected Logger logger = Logger.getLogger(this.getClass());<br />
&nbsp;&nbsp;&nbsp; List&lt;PerformanceData&gt; performanceData = new ArrayList&lt;PerformanceData&gt;();</p>
<p>&nbsp;&nbsp;&nbsp; @BeforeClass<br />
&nbsp;&nbsp;&nbsp; public static void init()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceUtil.init();<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; @AfterClass<br />
&nbsp;&nbsp;&nbsp; public static void report()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PerformanceReportManager.generatePerformanceReport();<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void execute(Method method)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PerformanceTest performanceTest = method.getAnnotation(PerformanceTest.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = performanceTest.name();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (name.equals(&quot;&quot;))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = method.getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.debug(&quot;Start execute test case&quot;+name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int times = performanceTest.times();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean stopOnError = performanceTest.stopOnError();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PerformanceData data = new PerformanceData(name, times);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; performanceData.add(data);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; times; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long start = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean error = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.invoke(this);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Throwable t)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.error(&quot;Execute performance test&quot; + name + &quot; error.&quot;, t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (stopOnError)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.error(&quot;Stop execute performance test&quot; + name + &quot; because of error.&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long end = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.addData(end &#8211; start);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (error)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.addError();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; @Test<br />
&nbsp;&nbsp;&nbsp; public void doPerformanceTests() throws Throwable<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class c = this.getClass();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PerformanceReportManager.addData(c, performanceData);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method[] methods = c.getMethods();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Method method : methods)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (method.isAnnotationPresent(PerformanceTest.class))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (method.getParameterTypes().length == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; execute(method);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.warn(&quot;Can not support execute performance test method with parameters:&quot; + method);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>/**<br />
&nbsp;* Performance data.<br />
&nbsp;*/<br />
public class PerformanceData<br />
{<br />
&nbsp;&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp;&nbsp; private int times;<br />
&nbsp;&nbsp;&nbsp; private long[] data;<br />
&nbsp;&nbsp;&nbsp; private int index = 0;<br />
&nbsp;&nbsp;&nbsp; private long max = Long.MIN_VALUE;<br />
&nbsp;&nbsp;&nbsp; private long min = Long.MAX_VALUE;<br />
&nbsp;&nbsp;&nbsp; private long total = 0;<br />
&nbsp;&nbsp;&nbsp; private int errors;</p>
<p>&nbsp;&nbsp;&nbsp; public PerformanceData(String name, int times)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.times = times;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = new long[times];<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public String getName()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public int getTimes()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return times;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public long[] getData()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return data;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void addData(long data)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.data[index++] = data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max = Math.max(max, data);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min = Math.min(min, data);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total += data;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public long getMax()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return max;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public long getMin()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return min;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public long getAveg()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (times == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getTotal() / times;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public long getTotal()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return total;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public int getErrors()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return errors;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void addError()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errors++;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>/**<br />
&nbsp;* Performance report manager.<br />
&nbsp;*/<br />
public class PerformanceReportManager<br />
{<br />
&nbsp;&nbsp;&nbsp; private static Map&lt;Class, List&lt;PerformanceData&gt;&gt; allData = new HashMap&lt;Class, List&lt;PerformanceData&gt;&gt;();<br />
&nbsp;&nbsp;&nbsp; private static PerformanceReporter performanceReporter = new DirectOutputPerformanceReporter();</p>
<p>&nbsp;&nbsp;&nbsp; public static void addData(Class c, List&lt;PerformanceData&gt; data)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allData.put(c, data);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void generatePerformanceReport()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; performanceReporter.generateReport(allData);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static PerformanceReporter getPerformanceReporter()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return performanceReporter;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void setPerformanceReporter(PerformanceReporter performanceReporter)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PerformanceReportManager.performanceReporter = performanceReporter;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>
public interface PerformanceReporter<br />
{<br />
&nbsp;&nbsp;&nbsp; public void generateReport(Map&lt;Class, List&lt;PerformanceData&gt;&gt; allData);<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/%e6%80%a7%e8%83%bd%e6%b5%8b%e8%af%95.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>信心测试的结果</title>
		<link>http://www.jiehoo.me/%e4%bf%a1%e5%bf%83%e6%b5%8b%e8%af%95%e7%9a%84%e7%bb%93%e6%9e%9c.htm</link>
		<comments>http://www.jiehoo.me/%e4%bf%a1%e5%bf%83%e6%b5%8b%e8%af%95%e7%9a%84%e7%bb%93%e6%9e%9c.htm#comments</comments>
		<pubDate>Thu, 27 Mar 2008 13:58:33 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[其它]]></category>
		<category><![CDATA[信心]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/%e4%bf%a1%e5%bf%83%e6%b5%8b%e8%af%95%e7%9a%84%e7%bb%93%e6%9e%9c.htm</guid>
		<description><![CDATA[呵呵，外服里面的信心测试结果： 结论：你对自己信心十足，明白自己的优点，同时也清楚自己的缺点。不过在别人眼里，你可能过于狂傲、甚至有点嚣张，你可以在别人面前表现得谦虚一点，这样对处理人际关系有好处。]]></description>
			<content:encoded><![CDATA[<p class='fp'>呵呵，外服里面的信心测试结果：</p>
<p>结论：你对自己信心十足，明白自己的优点，同时也清楚自己的缺点。不过在别人眼里，你可能过于狂傲、甚至有点嚣张，你可以在别人面前表现得谦虚一点，这样对处理人际关系有好处。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/%e4%bf%a1%e5%bf%83%e6%b5%8b%e8%af%95%e7%9a%84%e7%bb%93%e6%9e%9c.htm/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>MockEJB测试框架之自动发布EJB后续</title>
		<link>http://www.jiehoo.me/mockejb-auto-deploy-beans-initialcontext-implement.htm</link>
		<comments>http://www.jiehoo.me/mockejb-auto-deploy-beans-initialcontext-implement.htm#comments</comments>
		<pubDate>Fri, 24 Nov 2006 04:58:28 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[自动发布]]></category>
		<category><![CDATA[MockEJB]]></category>
		<category><![CDATA[框架]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/mockejb%e6%b5%8b%e8%af%95%e6%a1%86%e6%9e%b6%e4%b9%8b%e8%87%aa%e5%8a%a8%e5%8f%91%e5%b8%83ejb%e5%90%8e%e7%bb%ad.htm</guid>
		<description><![CDATA[本来今天已经完成了框架的大部分功能，写的一些测试用例都可以成功执行，但是自动发布是放在BaseTestCase里面的，感觉不好，就重构了一下，扩展了InitialContext类，覆盖了lookup方法（参数为字符串的那个，我们的代码中都是使用的这个），这样代码看起来更好一些的。另外我们的系统里面使用到了一些类似的机制，我为了产品可以进行单元测试还对一些Factory类进行了简单的修改，让他们返回我为了单元测试而写的实现类。如果使用这个扩展的InitialContext类，应该不需要做那些修改了，试了下，发现不行，因为产品的代码好像和Jboss的某些特性进行绑定了，先做简单的重构，以后再研究产品到底使用了JBoss的哪些特性，能否搞定。 代码如下： package test.base; import java.lang.reflect.Method; import java.util.Iterator; import javax.jms.MessageListener; import javax.naming.InitialContext; import javax.naming.NamingException; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.mockejb.EntityBeanDescriptor; import org.mockejb.MDBDescriptor; import org.mockejb.MockContainer; import org.mockejb.SessionBeanDescriptor; import org.mockejb.interceptor.Aspect; import org.mockejb.interceptor.AspectSystem; import org.mockejb.interceptor.ClassPointcut; import org.mockejb.interceptor.InvocationRecorder; import test.util.ClassUtil; import test.util.CommandUtil; import test.util.DataUtil; import test.util.DummyDataUtil; import test.util.EJBUtil; public class ARInitialContext extends InitialContext { &#160;&#160;&#160; private static Logger log [...]]]></description>
			<content:encoded><![CDATA[<p class='fp'>本来今天已经完成了框架的大部分功能，写的一些测试用例都可以成功执行，但是自动发布是放在BaseTestCase里面的，感觉不好，就<a href="http://www.jiehoo.com/mockejb-beans-configuration.htm">重构了一下</a>，扩展了InitialContext类，覆盖了lookup方法（参数为字符串的那个，我们的代码中都是使用的这个），这样代码看起来更好一些的。另外我们的系统里面使用到了一些类似的机制，我为了产品可以进行单元测试还对一些Factory类进行了简单的修改，让他们返回我为了单元测试而写的实现类。如果使用这个扩展的InitialContext类，应该不需要做那些修改了，试了下，发现不行，因为产品的代码好像和Jboss的某些特性进行绑定了，先做简单的重构，以后再研究产品到底使用了JBoss的哪些特性，能否搞定。<br />
代码如下： <br />
<span id="more-124"></span>package test.base;</p>
<p>import java.lang.reflect.Method;<br />
import java.util.Iterator;</p>
<p>import javax.jms.MessageListener;<br />
import javax.naming.InitialContext;<br />
import javax.naming.NamingException;</p>
<p>import org.apache.log4j.LogManager;<br />
import org.apache.log4j.Logger;<br />
import org.mockejb.EntityBeanDescriptor;<br />
import org.mockejb.MDBDescriptor;<br />
import org.mockejb.MockContainer;<br />
import org.mockejb.SessionBeanDescriptor;<br />
import org.mockejb.interceptor.Aspect;<br />
import org.mockejb.interceptor.AspectSystem;<br />
import org.mockejb.interceptor.ClassPointcut;<br />
import org.mockejb.interceptor.InvocationRecorder;</p>
<p>import test.util.ClassUtil;<br />
import test.util.CommandUtil;<br />
import test.util.DataUtil;<br />
import test.util.DummyDataUtil;<br />
import test.util.EJBUtil;</p>
<p>public class ARInitialContext extends InitialContext<br />
{<br />
&nbsp;&nbsp;&nbsp; private static Logger log = LogManager.getLogger(ARInitialContext.class);</p>
<p>&nbsp;&nbsp;&nbsp; private MockContainer mockContainer;</p>
<p>&nbsp;&nbsp;&nbsp; private AspectSystem aspectSystem;</p>
<p>&nbsp;&nbsp;&nbsp; public ARInitialContext() throws NamingException<br />
&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return the mockContainer<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public MockContainer getMockContainer()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mockContainer;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param mockContainer the mockContainer to set<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void setMockContainer(MockContainer mockContainer)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.mockContainer = mockContainer;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return the aspectSystem<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public AspectSystem getAspectSystem()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return aspectSystem;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param aspectSystem the aspectSystem to set<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void setAspectSystem(AspectSystem aspectSystem)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.aspectSystem = aspectSystem;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Lookup responding object, if not existed, try to init it.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * First try to init from custom init method(init+jndiName&#8217;s final part),<br />
&nbsp;&nbsp;&nbsp;&nbsp; * if failed, try to get BeanInfo from config file and init it.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param jndiName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public Object lookup(String jndiName) throws NamingException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return lookup(jndiName, true);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public Object lookup(String jndiName, boolean tryInit) throws NamingException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object objRef = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objRef = super.lookup(jndiName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (objRef != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return objRef;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (NamingException e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tryInit)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return tryToInitBean(jndiName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return objRef;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Init bean according to BeanInfo, can init entity bean, session bean and message driven bean.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param jndi<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param beanInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private void initBean(String jndi, BeanInfo beanInfo) throws Exception<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug(&quot;Init bean:&quot; + beanInfo.getShortName() + &quot;, JNDI:&quot; + jndi);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (beanInfo.getType() == BeanInfo.ENTITY_BEAN)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initEntityBean(jndi, beanInfo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (beanInfo.getType() == BeanInfo.SESSION_BEAN)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initSessionBean(jndi, beanInfo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (beanInfo.getType() == BeanInfo.MESSAGE_BEAN)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initMessageBean(beanInfo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error(&quot;Unsupported bean type: &quot; + beanInfo.getType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Init message bean, if the jndi name is start with &quot;topic/&quot;, then it is topic type, otherwise, it is queue type.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * The factory also is depending on its jndi name.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param beanInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private void initMessageBean(BeanInfo beanInfo) throws Exception<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class bean = ClassUtil.getClassForName(beanInfo.getBean());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String jndi = beanInfo.getJndi();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String factoryJndi = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (jndi.startsWith(Constant.TOPIC))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; factoryJndi = Constant.TOPIC_CONNECTION_FACTORY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; factoryJndi = Constant.QUEUE_CONNECTION_FACTORY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MDBDescriptor descriptor = new MDBDescriptor(factoryJndi, jndi, bean.newInstance());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (jndi.startsWith(Constant.TOPIC))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; descriptor.setIsTopic(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mockContainer.deploy(descriptor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InvocationRecorder recorder = new InvocationRecorder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aspectSystem.add(new ClassPointcut(MessageListener.class, false), recorder);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void initQueueConnectionFactory(String factoryJndi) throws Exception<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MDBDescriptor descriptor = new MDBDescriptor(factoryJndi, Constant.MOCK_QUEUE, new BaseMessageBean());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; descriptor.setIsTopic(false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mockContainer.deploy(descriptor);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void initTopicConnectionFactory(String factoryJndi) throws Exception<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MDBDescriptor descriptor = new MDBDescriptor(factoryJndi, Constant.MOCK_TOPIC, new BaseMessageBean());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; descriptor.setIsTopic(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mockContainer.deploy(descriptor);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private Object tryToInitBean(String jndiName)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanInfo beanInfo = EJBUtil.getBeanInfoByJndi(jndiName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (beanInfo == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error(&quot;Can not find BeanInfo for &quot; + jndiName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initBean(jndiName, beanInfo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return super.lookup(jndiName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error(&quot;Can not init bean:&quot; + jndiName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Inint entity bean and create all dummy record from dummy xml database.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param jndi<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param beanInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private void initEntityBean(String jndi, BeanInfo beanInfo) throws Exception<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class home = ClassUtil.getClassForName(beanInfo.getHome());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class remote = ClassUtil.getClassForName(beanInfo.getRemote());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class bean = ClassUtil.getClassForName(beanInfo.getBean());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class create = ClassUtil.getClassForName(Constant.ASPECT_PACKAGE + beanInfo.getShortName() + &quot;CreateAspect&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class find = ClassUtil.getClassForName(Constant.ASPECT_PACKAGE + beanInfo.getShortName() + &quot;FindAspect&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class setter = ClassUtil.getClassForName(Constant.ASPECT_PACKAGE + beanInfo.getShortName() + &quot;SetterAspect&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Aspect createAspect = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Aspect findAspect = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Aspect setterAspect = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (create != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createAspect = (Aspect) create.getConstructor(new Class[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { BeanInfo.class }).newInstance(new Object[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { beanInfo });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createAspect = new BaseCreateAspect(beanInfo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (find != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; findAspect = (Aspect) find.getConstructor(new Class[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { BeanInfo.class }).newInstance(new Object[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { beanInfo });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; findAspect = new BaseFindAspect(beanInfo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (setter != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setterAspect = (Aspect) setter.getConstructor(new Class[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { BeanInfo.class }).newInstance(new Object[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { beanInfo });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setterAspect = new BaseSetterAspect(beanInfo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aspectSystem.add(createAspect);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aspectSystem.add(findAspect);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aspectSystem.add(setterAspect);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EntityBeanDescriptor descriptor = new EntityBeanDescriptor(jndi, home, remote, bean);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mockContainer.deploy(descriptor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object homeObject = lookup(jndi);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method createMethod = ClassUtil.getMostSimpleCreateMethod(homeObject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class[] parameterTypes = createMethod.getParameterTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] values = new Object[parameterTypes.length];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator pks = DummyDataUtil.getPkValues(EJBUtil.getBeanInfoByJndi(jndi).getShortName()).iterator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (pks.hasNext())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Long pk = (Long) pks.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataUtil.setPk(beanInfo.getShortName(), pk);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createMethod.invoke(homeObject, values);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CommandUtil.executeCommands();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.warn(&quot;Can not init dummy data for &quot; + jndi, e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DummyDataUtil.initDatabaseInfo(beanInfo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.warn(&quot;Can not init database info for &quot; + jndi, e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Init session bean, maybe local type, depending on the jndi name<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param jndi<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param beanInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private void initSessionBean(String jndi, BeanInfo beanInfo) throws Exception<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class home = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class remote = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class bean = ClassUtil.getClassForName(beanInfo.getBean());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (jndi.equals(beanInfo.getJndi()))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; home = ClassUtil.getClassForName(beanInfo.getHome());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; remote = ClassUtil.getClassForName(beanInfo.getRemote());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; home = ClassUtil.getClassForName(beanInfo.getLocalHome());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; remote = ClassUtil.getClassForName(beanInfo.getLocal());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class aspectClass = ClassUtil.getClassForName(Constant.ASPECT_PACKAGE + beanInfo.getShortName() + &quot;Aspect&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Aspect aspect = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (aspectClass != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aspect = (Aspect) aspectClass.getConstructor(new Class[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { BeanInfo.class }).newInstance(new Object[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { beanInfo });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aspectSystem.add(aspect);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionBeanDescriptor descriptor = new SessionBeanDescriptor(jndi, home, remote, bean);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mockContainer.deploy(descriptor);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void deploySessionBean(String jndi, Class home, Class remote, Object bean) throws Exception<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionBeanDescriptor descriptor = new SessionBeanDescriptor(jndi, home, remote, bean);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mockContainer.deploy(descriptor);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/mockejb-auto-deploy-beans-initialcontext-implement.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
