﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-liuzheng-文章分类-Jmock</title><link>http://www.blogjava.net/liuzheng/category/27811.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 05 Dec 2007 02:56:32 GMT</lastBuildDate><pubDate>Wed, 05 Dec 2007 02:56:32 GMT</pubDate><ttl>60</ttl><item><title>jmock测试的准备工作</title><link>http://www.blogjava.net/liuzheng/articles/165422.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Wed, 05 Dec 2007 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/165422.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/165422.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/165422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/165422.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/165422.html</trackback:ping><description><![CDATA[private Mockery context = new JUnit4Mockery() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setImposteriser(ClassImposteriser.INSTANCE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; };<br />
<br />
注意这里的setImposteriser(ClassImposteriser.INSTANCE);<br />
因为默认的JUnit4Mockery的Imposteriser是JavaReflectionImposteriser，他是针对接口进行mock的，如果要针对class进行mock，必须setImposteriser(ClassImposteriser.INSTANCE);<br />
这样之后context便可以对class进行mock了<br />
<br />
<br />
官方的文档：<br />
<br />
<div id="content">
<h1>Mocking Classes with jMock and the ClassImposteriser</h1>
<p>Because it uses Java's standard reflection capability, the default
configuration of the jMock framework can only mock interfaces, not classes.
(Actually, we consider that to be a good thing because it encourages the
design to focus on communication between objects rather than static
classification or data storage). However, the <code>ClassImposteriser</code>
extension class uses the <a href="http://cglib.sourceforge.net/">CGLIB 2.1</a><sup>1</sup>
and <a href="http://code.google.com/p/objenesis/">Objenesis</a><sup>2</sup> libraries to
create mock objects of classes as well as interfaces. This is useful when
working with legacy code to tease apart dependencies between tightly coupled
classes.</p>
<p>To use the <code>ClassImposteriser</code>:</p>
<ol>
    <li>Add jmock-legacy-2.1.0-RC<var>n</var>.jar, cglib-nodep-2.1_3.jar and
    objenesis-1.0.jar to your CLASSPATH.</li>
    <li>Plug the <code>ClassImposteriser</code> into the Mockery of your test
    class:
    <div deselected="">
    <h3>Raw</h3>
    <pre java="">import org.jmock.Mockery;<br />
    import org.jmock.Expectations;<br />
    import org.jmock.lib.legacy.ClassImposteriser;<br />
    <br />
    public class ConcreteClassTest extends TestCase {<br />
    private Mockery context = new Mockery() {{<br />
    setImposteriser(ClassImposteriser.INSTANCE);<br />
    }};<br />
    <br />
    ...<br />
    }</pre>
    </div>
    <div deselected="">
    <h3>JUnit 3</h3>
    <pre java="">import org.jmock.Expectations;<br />
    import org.jmock.integration.junit3.MockObjectTestCase;<br />
    import org.jmock.lib.legacy.ClassImposteriser;<br />
    <br />
    public class ConcreteClassTest extends MockObjectTestCase {<br />
    {<br />
    setImposteriser(ClassImposteriser.INSTANCE);<br />
    }<br />
    <br />
    ...<br />
    }</pre>
    </div>
    <div selected="">
    <h3>JUnit 4</h3>
    <pre java="">import org.jmock.Mockery;<br />
    import org.jmock.Expectations;<br />
    import org.jmock.integration.junit4.JUnit4Mockery;<br />
    import org.jmock.lib.legacy.ClassImposteriser;<br />
    <br />
    @RunWith(JMock.class)<br />
    public class ConcreteClassTest {<br />
    private Mockery context = new JUnit4Mockery() {{<br />
    setImposteriser(ClassImposteriser.INSTANCE);<br />
    }};<br />
    <br />
    ...<br />
    }</pre>
    </div>
    </li>
    <li>Your tests can now create mocks of abstract or even concrete classes:
    <pre java="">Graphics g = context.mock(java.awt.Graphics.class);</pre>
    </li>
</ol>
</div>
<br />
<img src ="http://www.blogjava.net/liuzheng/aggbug/165422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-12-05 10:54 <a href="http://www.blogjava.net/liuzheng/articles/165422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jmock和Junit4结合进行mock测试</title><link>http://www.blogjava.net/liuzheng/articles/165160.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Tue, 04 Dec 2007 06:00:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/165160.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/165160.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/165160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/165160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/165160.html</trackback:ping><description><![CDATA[<h1>jMock 2 Cheat Sheet</h1>
<h2>Test Fixture Class</h2>
<div deselected="">
<h3>Raw</h3>
<pre java="">import org.jmock.Mockery;<br />
import org.jmock.Expectations;<br />
<br />
public class AJMock2TestCase ... {<br />
Mockery context = new Mockery();<br />
<br />
...<br />
}</pre>
</div>
<div deselected="">
<h3>JUnit 3 Integration</h3>
<pre java="">import org.jmock.integration.junit3.MockObjectTestCase;<br />
import org.jmock.Expectations;<br />
<br />
public class TurtleDrawingTest extends MockObjectTestCase {<br />
...<br />
}</pre>
</div>
<div selected="">
<h3>JUnit 4 Integration</h3>
<pre java="">import org.jmock.Expectations;<br />
import org.jmock.Mockery;<br />
import org.jmock.integration.junit4.JMock;<br />
import org.jmock.integration.junit4.JUnit4Mockery;<br />
<br />
@RunWith(JMock.class)<br />
public class AJMock2TestCase {<br />
Mockery context = new JUnit4Mockery();<br />
<br />
...<br />
}</pre>
</div>
<div>
<p>A <code>Mockery</code> represents the context
of the object under test: the objects that it communicates with. A Mockery
creates mock objects and checks expectations that are set upon those mock
objects. By convention the Mockery is stored in an instance variable named
<var>context</var>.</p>
<p deselected="">Tests written with JUnit 3 can
extend MockObjectTestCase, in which case they don't need to explictly
create or refer to the context.</p>
<p selected="">Tests written with
JUnit 4 do not need to extend a specific base class but must specify that
they use jMock with the <code>@RunWith</code> attribute, create a
JUnit4Mockery that reports expectation failures as JUnit 4 test failures,
and store the Mockery in an instance variable.</p>
</div>
<h2>Creating Mock Objects</h2>
<div deselected="">
<h3>Raw</h3>
<pre java="">Turtle turtle = context.mock(Turtle.class);<br />
Turtle turtle2 = context.mock(Turtle.class, "turtle2");</pre>
</div>
<div deselected="">
<h3>JUnit 3 Integration</h3>
<pre java="">Turtle turtle = mock(Turtle.class);<br />
Turtle turtle2 = mock(Turtle.class, "turtle2");</pre>
</div>
<div selected="">
<h3>JUnit 4 Integration</h3>
<pre java="">Turtle turtle = context.mock(Turtle.class);<br />
Turtle turtle2 = context.mock(Turtle.class, "turtle2");</pre>
</div>
<p>The examples above assume that the mock object is stored in an instance
variable. If a mock object is stored in a local variable, the variable
must be declared as <code>final</code> so that it can be referred to from
within expectation blocks (see below).</p>
<h2>Tests with Expectations</h2>
<div deselected="">
<h3>Raw</h3>
<pre java="">... create mock objects ...<br />
<br />
public void testSomeAction() {<br />
... set up ...<br />
<br />
context.checking(new Expectations() {{<br />
... expectations go here ...<br />
}});<br />
<br />
... call code being tested ...<br />
<br />
context.assertIsSatisfied();<br />
<br />
... other assertions ...<br />
}</pre>
</div>
<div deselected="">
<h3>JUnit 3 Integration</h3>
<pre java="">... create mock objects ...<br />
<br />
public void testSomeAction() {<br />
... set up ...<br />
<br />
checking(new Expectations() {{<br />
... expectations go here ...<br />
}});<br />
<br />
... call code being tested ...<br />
<br />
... assertions ...<br />
}</pre>
</div>
<div selected="">
<h3>JUnit 4 Integration</h3>
<pre java="">... create mock objects ...<br />
<br />
public void testSomeAction() {<br />
... set up ...<br />
<br />
context.checking(new Expectations() {{<br />
... expectations go here ...<br />
}});<br />
<br />
... call code being tested ...<br />
<br />
... assertions ...<br />
}</pre>
</div>
<div selected="">
<p>The JUnit 3 and JUnit 4 integration layers
automatically assert that all expectations have been satisfied.</p>
</div>
<p>An expectations block can contain any number of expectations. A test
can contain multiple expectation blocks. Expectations in later blocks are
appended to those in earlier blocks. Expectations can be interspersed with
calls to the code under test.</p>
<h2>Expectations</h2>
<p>Expectations have the following structure:</p>
<pre java=""><var>invocation-count</var> (<var>mock-object</var>).<var>method</var>(<var>argument-constraints</var>);<br />
inSequence(<var>sequence-name</var>);<br />
when(<var>state-machine</var>.is(<var>state-name</var>));<br />
will(<var>action</var>);<br />
then(<var>state-machine</var>.is(<var>new-state-name</var>));</pre>
<p>Except for the invocation count and the mock object, all clauses are
optional. You can give an expectation as many <code>inSequence</code>,
<code>when</code>, <code>will</code> and <code>then</code> clauses as you
wish.</p>
<p>Some examples:</p>
<pre java="">one (turtle).turn(45);           // The turtle will be told to turn 45 degrees once only<br />
<br />
allowing (turtle).flashLEDs();   // The turtle can be told to flash its LEDs any number of types or not at all<br />
<br />
ignoring (turtle2);              // Turtle 2 can be told to do anything.  This test ignores it.<br />
<br />
allowing (turtle).queryPen();    // The turtle can be asked about its pen any number of times and will always<br />
will(returnValue(PEN_DOWN)); // return PEN_DOWN<br />
<br />
atLeast(1).of (turtle).stop();   // The turtle will be told to stop at least once.</pre>
<h3>Invocation Count</h3>
<table>
    <tbody>
        <tr>
            <td>one</td>
            <td>The invocation is expected once and once only.</td>
        </tr>
        <tr>
            <td>exactly(<var>n</var>).of</td>
            <td>The invocation is expected exactly <var>n</var> times. Note:
            <code>one</code> is a convenient shorthand for
            <code>exactly(1)</code>.</td>
        </tr>
        <tr>
            <td>atLeast(<var>n</var>).of</td>
            <td>The invocation is expected at least <var>n</var>.</td>
        </tr>
        <tr>
            <td>atMost(<var>n</var>).of</td>
            <td>The invocation is expected at most <var>n</var> times.</td>
        </tr>
        <tr>
            <td>between(<var>min</var>,&nbsp;<var>max</var>).of</td>
            <td>The invocation is expected at least <var>min</var> times and at
            most <var>max</var> times.</td>
        </tr>
        <tr>
            <td>allowing</td>
            <td>The invocation is allowed any number of times but does not have
            to happen.</td>
        </tr>
        <tr>
            <td>ignoring</td>
            <td>The same as <code>allowing</code>. Allowing or ignoring should
            be chosen to make the test code clearly express intent.</td>
        </tr>
        <tr>
            <td>never</td>
            <td>The invocation is not expected at all. This is used to make
            tests more explicit and so easier to understand.</td>
        </tr>
    </tbody>
</table>
<h3>Methods And Expectations</h3>
<p>Expected methods are specified by a literal call to the method within
an expectation block.</p>
<p>Arguments passed to the method in an expectation will be compared for
equality.</p>
<pre java="">one (calculator).add(1, 1); will(returnValue(2));<br />
one (calculator).add(2, 2); will(returnValue(5));</pre>
<p>To define looser constraints, specify <em>all</em> arguments as
matchers within <code>with</code> clauses:</p>
<pre java="">allowing (calculator).add(with(any(int.class)), with(any(int.class)));</pre>
<h3>Argument Matchers</h3>
<p>The most commonly used matchers are defined in the <a href="http://www.jmock.org/javadoc/2.0.0/org/jmock/Expectations.html">Expectations</a><sup>1</sup>
class:</p>
<table>
    <tbody>
        <tr>
            <td>equal(<var>n</var>)</td>
            <td>The argument is equal to <var>n</var>.</td>
        </tr>
        <tr>
            <td>same(<var>o</var>)</td>
            <td>The argument is the same object as <var>o</var>.</td>
        </tr>
        <tr>
            <td>any(Class&lt;T&gt; type)</td>
            <td>The argument is any value. The type argument is required to
            force Java to type-check the argument at compile time.</td>
        </tr>
        <tr>
            <td>a(Class&lt;T&gt; type)<br />
            an(Class&lt;T&gt; type)</td>
            <td>The argument is an instance of <var>type</var> or a subclass of
            <var>type</var>.</td>
        </tr>
        <tr>
            <td>aNull(Class&lt;T&gt;&nbsp;type)</td>
            <td>The argument is null. The type argument is required to force
            Java to type-check the argument at compile time.</td>
        </tr>
        <tr>
            <td>aNonNull(Class&lt;T&gt;&nbsp;type)</td>
            <td>The argument is not null. The type argument is required to force
            Java to type-check the argument at compile time.</td>
        </tr>
        <tr>
            <td>not(<var>m</var>)</td>
            <td>The argument does not match the Matcher <var>m</var>.</td>
        </tr>
        <tr>
            <td>anyOf(<var>m<sub>1</sub></var>, <var>m<sub>2</sub></var>, ...,
            <var>m<sub>n</sub></var>)</td>
            <td>The argument matches one of the Matchers
            <var>m<sub>1</sub></var> to
            <var>m<sub>n</sub></var><sub>.</sub></td>
        </tr>
        <tr>
            <td>allOf(<var>m<sub>1</sub></var>, <var>m<sub>2</sub></var>, ...,
            m<sub>n</sub>)</td>
            <td>The argument matches all of the Matchers
            <var>m<sub>1</sub></var> to <var>m<sub>n</sub></var>.</td>
        </tr>
    </tbody>
</table>
<p>More matchers are defined as static factory methods of the <a href="http://www.jmock.org/javadoc/2.0.0/org/hamcrest/Matchers.html">Hamcrest Matchers
class</a><sup>2</sup>, which can be statically imported at the top of the test
code.</p>
<h3>Actions</h3>
<table>
    <tbody>
        <tr>
            <td>will(returnValue(<var>v</var>))</td>
            <td>Return <var>v</var> to the caller.</td>
        </tr>
        <tr>
            <td>will(returnIterator(<var>c</var>))</td>
            <td>Return a new iterator over collection <var>c</var> on each
            invocation.</td>
        </tr>
        <tr>
            <td>will(returnIterator(<var>v<sub>1</sub></var>,
            <var>v<sub>2</sub></var>, ..., <var>v<sub>n</sub></var>))</td>
            <td>Return a new iterator over elements <var>v<sub>1</sub></var> to
            <var>v<sub>n</sub></var> on each invocation.</td>
        </tr>
        <tr>
            <td>will(throwException(<var>e</var>))</td>
            <td>Throw <var>e</var> to the caller.</td>
        </tr>
        <tr>
            <td>will(doAll(<var>a<sub>1</sub></var>, <var>a<sub>2</sub></var>,
            ..., <var>a<sub>n</sub></var>))</td>
            <td>Do all actions <var>a<sub>1</sub></var> to
            <var>a<sub>n</sub></var> on every invocation.</td>
        </tr>
    </tbody>
</table>
<h3>Sequences</h3>
<p>Invocations that are expected in a sequence must occur in the order in
which they appear in the test code. A test can create more than one
sequence and an expectation can be part of more than once sequence at a
time.</p>
<p>To define a new sequence:</p>
<div deselected="">
<h3>Raw</h3>
<pre source="">final Sequence <var>sequence-name</var> = context.sequence("<var>sequence-name</var>");</pre>
</div>
<div deselected="">
<h3>JUnit 3</h3>
<pre source="">final Sequence <var>sequence-name</var> = sequence("<var>sequence-name</var>");</pre>
</div>
<div selected="">
<h3>JUnit 4</h3>
<pre source="">final Sequence <var>sequence-name</var> = context.sequence("<var>sequence-name</var>");</pre>
</div>
<p>To expect a sequence of invocations, write the expectations in order
and add the <code>inSequence(<var>sequence</var>)</code> clause to each
one. For example:</p>
<pre source="">one (turtle).forward(10); inSequence(drawing);<br />
one (turtle).turn(45); inSequence(drawing);<br />
one (turtle).forward(10); inSequence(drawing);</pre>
<p>Expectations in a sequence can have any invocation count.</p>
<h2>States</h2>
<p>States are used to constrain invocations to occur only when a condition
is true. Conditions are represented as states of state machines. A test
can create multiple state machines and each state machine can have
multiple states. An invocation can be constrained to occur during a state
of one more more state machines.</p>
<p>To define a new state machine:</p>
<div deselected="">
<h3>Raw</h3>
<pre source="">final States <var>state-machine-name</var> = context.states("<var>state-machine-name</var>").startsAs("<var>initial-state</var>");</pre>
</div>
<div deselected="">
<h3>JUnit 3</h3>
<pre source="">final States <var>state-machine-name</var> = states("<var>state-machine-name</var>").startsAs("<var>initial-state</var>");</pre>
</div>
<div selected="">
<h3>JUnit 4</h3>
<pre source="">final States <var>state-machine-name</var> = context.states("<var>state-machine-name</var>").startsAs("<var>initial-state</var>");</pre>
</div>
<p>The intial state is optional. If not specified, the state machine
starts in an unnamed initial state.</p>
<p>The following clauses constrain invocations to occur within specific
states and define how an invocation will change the current state of a
state machine.</p>
<table>
    <tbody>
        <tr>
            <td>when(<var>state-machine</var>.is("<var>state-name</var>"));</td>
            <td>Constrains the last expectation to occur only when the state
            machine is in the named state.</td>
        </tr>
        <tr>
            <td>then(<var>state-machine</var>.is("<var>state-name</var>"));</td>
            <td>Changes the state of <var>state-machine</var> to the named state
            when the invocation occurs.</td>
        </tr>
    </tbody>
</table>
<p>For example:</p>
<pre source="">final States pen = context.states("pen").startsAs("up");<br />
one (turtle).penDown(); then(pen.is("down"));<br />
one (turtle).forward(10); when(pen.is("down"));<br />
one (turtle).turn(90); when(pen.is("down"));<br />
one (turtle).forward(10); when(pen.is("down"));<br />
one (turtle).penUp(); then(pen.is("up"));<br />
<br />
<br />
<br />
<br />
<br />
<br />
例子代码为：<br />
<br />
package nl.enovation.commons.monitor;<br />
<br />
import static org.junit.Assert.assertEquals;<br />
import static org.junit.Assert.assertNotNull;<br />
<br />
import java.util.Collection;<br />
import java.util.Properties;<br />
<br />
import javax.mail.Folder;<br />
import javax.mail.Message;<br />
import javax.mail.MessagingException;<br />
import javax.mail.Session;<br />
import javax.mail.Store;<br />
import javax.mail.Flags.Flag;<br />
import javax.mail.internet.MimeMessage;<br />
<br />
import nl.enovation.commons.IdGenerator;<br />
import nl.enovation.commons.MailIdGenerator;<br />
import nl.enovation.ems.commons.mailsender.MailSender;<br />
import nl.enovation.ems.commons.mailsender.SMTPMailSender;<br />
<br />
import org.jmock.Expectations;<br />
import org.jmock.Mockery;<br />
import org.jmock.lib.legacy.ClassImposteriser;<br />
import org.junit.Test;<br />
<br />
public class MailLoopMonitorTest {<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; private Mockery context = new Mockery() {{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setImposteriser(ClassImposteriser.INSTANCE);<br />
&nbsp;&nbsp;&nbsp; }};<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; @Test<br />
&nbsp;&nbsp;&nbsp; public void shouldReturnOkStatus()throws Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //set up<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailSender mailSender = context.mock(MailSender.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailChecker mailChecker = context.mock(MailChecker.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String name="MailLoopMonitor";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailLoopMonitor mailLoopMonitor = new MailLoopMonitor(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Status OkStatus=new Status(Status.Code.OK,name,"Ok");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String recipient="yves.guo@localhost.com";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String sender="yves.guo@vanad.com.cn"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String subject="TestSubject";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String message="TestBody";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // expectations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.checking(new Expectations() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; allowing (mailChecker).check(with(any(String.class))); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; will(returnValue(OkStatus));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; one(mailSender).sendMessage(with(any(MimeMessage.class)),with(any(String.class)),with(any(Collection.class)));<br />
<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; //execute<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setIdGenerator(new MailIdGenerator());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailChecker(mailChecker);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailSender(mailSender); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSender(sender);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setRecipient(recipient);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSubject(subject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMessage(message);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals(Status.Code.OK, (mailLoopMonitor.check(name)).getCode()); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // verify<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.assertIsSatisfied();<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; @Test<br />
&nbsp;&nbsp;&nbsp; public void shouldReturnErrorStatusOnSendFailure() throws Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set up<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailChecker mailChecker = context.mock(MailChecker.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String name="MailLoopMonitor";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailLoopMonitor mailLoopMonitor = new MailLoopMonitor();&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final IdGenerator idGenerator=new MailIdGenerator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final SMTPMailSender mailSender=new SMTPMailSender();&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String recipient="yves.guo@localhost.com";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String sender="yves.guo@vanad.com.cn";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String subject="TestSubject";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String message="Test";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String host="wrong smtp host";//set a wrong host,should cause connect failure.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final int checkTimes=3,intervalTime=1000;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // expectations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.checking(new Expectations() {<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; //should not execute MailCheck.check();&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;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // execute<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailSender.setHost(host);&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailSender.setPort(25);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSender(sender);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setRecipient(recipient);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setCheckTimes(checkTimes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setIntervalTime(intervalTime);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailChecker(mailChecker);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailSender(mailSender);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setIdGenerator(idGenerator);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSubject(subject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMessage(message);&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Status status=mailLoopMonitor.check(name);&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals(Status.Code.CRITICAL, status.getCode());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertNotNull(status.getCause());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertNotNull(status.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // verify<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.assertIsSatisfied();<br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; @Test<br />
&nbsp;&nbsp;&nbsp; public void shouldReturnErrorStatusOnConnectedFailure()throws Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //set up<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailSender mailSender = context.mock(MailSender.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final IdGenerator idGenerator=context.mock(MailIdGenerator.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String name="MailLoopMonitor";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String recipient="yves.guo@localhost.com";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String sender="yves.guo@vanad.com.cn";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String receiver="yves";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String subject="TestSubject";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String message="TestBody";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String host="wrong host";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //a wrong pop3 host <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailLoopMonitor mailLoopMonitor = new MailLoopMonitor(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Pop3MailChecker pop3MailChecker=new Pop3MailChecker();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // expectations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.checking(new Expectations() {<br />
&nbsp;&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; allowing(idGenerator).getNextId();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; will(returnValue("2007-12-337 13:12:3750"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; one(mailSender).sendMessage(with(any(MimeMessage.class)),with(any(String.class)),with(any(Collection.class)));<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; //execute<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Properties props = new Properties();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.put("mail.pop3.host",host);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session session = Session.getDefaultInstance(props, null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setStore(session.getStore("pop3"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setHost(host);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setPort(110);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setUser(receiver);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setPassword("");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setIdGenerator(idGenerator);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailChecker(pop3MailChecker);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailSender(mailSender); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSender(sender);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setRecipient(recipient);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSubject(subject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMessage(message);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Status status =mailLoopMonitor.check(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals(Status.Code.CRITICAL, status.getCode()); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertNotNull(status.getCause());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertNotNull(status.getMessage());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // verify<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.assertIsSatisfied();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; @Test<br />
&nbsp;&nbsp;&nbsp; public void shouldReturnErrorStatusOnGetMessagesFromFolderFailure()throws Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //set up<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailSender mailSender = context.mock(MailSender.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Store store=context.mock(Store.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Folder folder=context.mock(Folder.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String name="MailLoopMonitor";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String recipient="yves.guo@localhost.com";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String sender="yves.guo@vanad.com.cn";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String subject="TestSubject";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String message="TestBody";&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailLoopMonitor mailLoopMonitor = new MailLoopMonitor(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Pop3MailChecker pop3MailChecker=new Pop3MailChecker();&nbsp;&nbsp; &nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // expectations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.checking(new Expectations() {<br />
&nbsp;&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; one(mailSender).sendMessage(with(any(MimeMessage.class)),with(any(String.class)),with(any(Collection.class)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(store).connect(with(any(String.class)),with(any(String.class)),with(any(String.class)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(store).isConnected();will(returnValue(false));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(store).close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).open(Folder.READ_WRITE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).close(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).isOpen();will(returnValue(false));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).getMessages();will(throwException(new MessagingException()));<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp; //execute<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setStore(store);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setFolder(folder);&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setIdGenerator(new MailIdGenerator());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailChecker(pop3MailChecker);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailSender(mailSender); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSender(sender);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setRecipient(recipient);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSubject(subject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMessage(message);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Status status =mailLoopMonitor.check(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals(Status.Code.CRITICAL, status.getCode()); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertNotNull(status.getCause());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertNotNull(status.getMessage()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // verify<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.assertIsSatisfied();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; @Test<br />
&nbsp;&nbsp;&nbsp; public void shouldReturnNoMatchedMessageIDsOnMacthID()throws Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //set up<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailSender mailSender = context.mock(MailSender.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final IdGenerator idGenerator=context.mock(MailIdGenerator.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Store store=context.mock(Store.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Folder folder=context.mock(Folder.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Message mockedMessage=context.mock(Message.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String name="MailLoopMonitor";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String recipient="yves.guo@localhost.com";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String sender="yves.guo@vanad.com.cn";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String subject="TestSubject";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String message="TestBody";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Message[] messages={mockedMessage};&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailLoopMonitor mailLoopMonitor = new MailLoopMonitor(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Pop3MailChecker pop3MailChecker=new Pop3MailChecker();&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String generatedID="2007-12-337 13:12:3750";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String[] headInformation = {"not the same as generatedID"};//not the same as generatedID,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //should return No matched message IDs<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // expectations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.checking(new Expectations() {<br />
&nbsp;&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; allowing(idGenerator).getNextId();will(returnValue(generatedID));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; one(mailSender).sendMessage(with(any(MimeMessage.class)),with(any(String.class)),with(any(Collection.class)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(store).connect(with(any(String.class)),with(any(String.class)),with(any(String.class)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(store).isConnected();will(returnValue(false));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(store).close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).open(Folder.READ_WRITE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).close(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).isOpen();will(returnValue(false));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).getMessages();will(returnValue(messages));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(mockedMessage).getHeader("Generated-ID");will(returnValue(headInformation));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(mockedMessage).setFlag(Flag.DELETED, true);&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;&nbsp;&nbsp;&nbsp;&nbsp; //execute<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setStore(store);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setFolder(folder);&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setIdGenerator(idGenerator);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailChecker(pop3MailChecker);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailSender(mailSender); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSender(sender);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setRecipient(recipient);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSubject(subject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMessage(message);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Status status =mailLoopMonitor.check(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals(Status.Code.CRITICAL, status.getCode()); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertNotNull(status.getCause());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertNotNull(status.getMessage()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // verify<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.assertIsSatisfied();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; @Test<br />
&nbsp;&nbsp;&nbsp; public void shouldReturnErrorStatusOnOpenFolderFailure()throws Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //set up<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailSender mailSender = context.mock(MailSender.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Store store=context.mock(Store.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Folder folder=context.mock(Folder.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String name="MailLoopMonitor";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String recipient="yves.guo@localhost.com";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String sender="yves.guo@vanad.com.cn";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String subject="TestSubject";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String message="TestBody";&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final MailLoopMonitor mailLoopMonitor = new MailLoopMonitor(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Pop3MailChecker pop3MailChecker=new Pop3MailChecker();&nbsp;&nbsp; &nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // expectations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.checking(new Expectations() {<br />
&nbsp;&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; one(mailSender).sendMessage(with(any(MimeMessage.class)),with(any(String.class)),with(any(Collection.class)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(store).connect(with(any(String.class)),with(any(String.class)),with(any(String.class)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(store).isConnected();will(returnValue(false));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(store).close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).open(Folder.READ_WRITE);will(throwException(new MessagingException()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).close(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allowing(folder).isOpen();will(returnValue(false));<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; //execute<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setStore(store);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop3MailChecker.setFolder(folder);&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setIdGenerator(new MailIdGenerator());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailChecker(pop3MailChecker);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMailSender(mailSender); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSender(sender);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setRecipient(recipient);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setSubject(subject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailLoopMonitor.setMessage(message);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Status status =mailLoopMonitor.check(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals(Status.Code.CRITICAL, status.getCode()); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertNotNull(status.getCause());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertNotNull(status.getMessage());&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // verify<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.assertIsSatisfied();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
}<br />
<br />
<br />
<br />
<br />
</pre>
<img src ="http://www.blogjava.net/liuzheng/aggbug/165160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-12-04 14:00 <a href="http://www.blogjava.net/liuzheng/articles/165160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>