<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Floehopper: Tag mocha</title>
    <link>http://blog.floehopper.org/articles/tag/mocha?tag=mocha</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>thoughts on the bergy bits of life</description>
    <item>
      <title>Mocha Release 0.9.1</title>
      <description>&lt;h2&gt;Release Notes&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;Fixed bug #21465 &amp;#8211; expects &amp;#38; stubs should support method names as strings (as well as symbols) or fail fast. Convert all expectation method names to a symbol in case they were supplied as a string.&lt;/li&gt;
		&lt;li&gt;By removing Mock#unexpected_method_called we reduce the number of methods vulnerable to the problem that surfaced in bug #21563.&lt;/li&gt;
		&lt;li&gt;Fix bug #21563 &amp;#8211; stubbing &amp;#8216;verified?&amp;#8217; method is unsafe. Instance method names on the Mock class should be more obscure.&lt;/li&gt;
		&lt;li&gt;Performance improvement. StubbaExampleTest goes twice as fast on my local machine.&lt;/li&gt;
		&lt;li&gt;Added primitive performance test to default rake task.&lt;/li&gt;
		&lt;li&gt;Fix format of case statements which don&amp;#8217;t work in Ruby 1.9 and make others consistent.&lt;/li&gt;
		&lt;li&gt;There is no point in running (potentially expensive) checks if configuration is set to allow such checks to fail. This is a relatively quick fix in response to Chris McGrath&amp;#8217;s performance problems.&lt;/li&gt;
		&lt;li&gt;Fix for bug #21161 &amp;#8211; &amp;#8216;uninitialized constant Deprecation in stubba.rb&amp;#8217;.&lt;/li&gt;
		&lt;li&gt;It&amp;#8217;s more readable to talk about &amp;#8216;once&amp;#8217; and &amp;#8216;twice&amp;#8217; rather than &amp;#8216;1 time&amp;#8217; and &amp;#8216;2 times&amp;#8217;.&lt;/li&gt;
		&lt;li&gt;Fix bug #20883 &amp;#8211; never should raise when called to prevent follow up errors. Fail fast when there are no matching invokable expectations and handle the stub_everything case sensibly. This might not be entirely backwards compatible, but I think the benefits outweigh the risks. The most likely change is that a test that was already failing will now fail faster, which doesn&amp;#8217;t seem so awful.&lt;/li&gt;
	&lt;/ul&gt;</description>
      <pubDate>Sat, 30 Aug 2008 16:48:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:be9e6b4d-d778-45cb-a779-7ff68a457eb3</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2008/08/30/mocha-release-0-9-1</link>
      <category>mocha_release</category>
      <category>mocha</category>
      <category>mock</category>
      <category>stub</category>
      <category>ruby</category>
      <category>testing</category>
      <category>tdd</category>
    </item>
    <item>
      <title>Optional Parameters in Mocha</title>
      <description>&lt;p&gt;One of the &lt;a href="http://blog.floehopper.org/articles/2008/06/24/mocha-0-9-released"&gt;new features&lt;/a&gt; added in &lt;a href="http://mocha.rubyforge.org/"&gt;Mocha&lt;/a&gt; 0.9 is the ability to specify the values of optional parameters without requiring them to be present. Some examples should make this clearer&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s assume we&amp;#8217;re trying to set up an expectation for the invocation of a method which has some parameters with default values&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;my_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;one&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;two&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;three&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;four&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="comment"&gt;# implementation&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;We can use the new &lt;a href="http://mocha.rubyforge.org/classes/Mocha/ParameterMatchers.html#M000024"&gt;Mocha::ParameterMatchers#optionally&lt;/a&gt; method within the call to &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000042"&gt;Expectation#with&lt;/a&gt; as follows&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:my_method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;with&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;optionally&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This specifies that we are expecting an invocation of &lt;code&gt;my_method&lt;/code&gt;. As usual, the first two &lt;em&gt;required&lt;/em&gt; parameters (&lt;code&gt;one&lt;/code&gt; &amp;#38; &lt;code&gt;two&lt;/code&gt;) must have values &lt;code&gt;1&lt;/code&gt; &amp;#38; &lt;code&gt;2&lt;/code&gt; respectively. However, the last two &lt;em&gt;optional&lt;/em&gt; parameters (&lt;code&gt;three&lt;/code&gt; &amp;#38; &lt;code&gt;four&lt;/code&gt;) only have to have the values &lt;code&gt;3&lt;/code&gt; &amp;#38; &lt;code&gt;4&lt;/code&gt; respectively if they are supplied.&lt;/p&gt;


	&lt;p&gt;So any of the following invocations would satisfy the expectation&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;my_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;my_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;my_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Whereas none of the following invocations would satisfy the expectation and an error would be raised&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;my_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;my_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;my_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;my_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;my_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;5&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 12 Jul 2008 11:30:03 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:3c633209-7be1-41ed-8b4e-a74caec54401</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2008/07/12/optional-parameters-in-mocha</link>
      <category>mocha</category>
      <category>mock</category>
      <category>stub</category>
      <category>parameter</category>
      <category>option</category>
    </item>
    <item>
      <title>Mocha 0.9 Released</title>
      <description>&lt;p&gt;There&amp;#8217;s been quite a bit of work going on in &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; over recent months, but a release is long overdue. The &lt;span class="caps"&gt;API&lt;/span&gt; is now pretty stable and so this release jumps from version 0.5 to 0.9. Much of the work has been refactoring Mocha&amp;#8217;s internals to support new features and make the code more maintainable.&lt;/p&gt;


	&lt;p&gt;Before attempting the refactoring, extensive acceptance tests were added. One of the benefits of this is that it should now be easier to write new acceptance tests if you want to suggest new features or illustrate a bug ;-)&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s a quick summary of the changes in the release. I&amp;#8217;ll try to post some code examples here in the near future.&lt;/p&gt;


	&lt;h2&gt;Ordering constraints&lt;/h2&gt;


	&lt;p&gt;Based on the &lt;a href="http://jmock.org/"&gt;JMock&lt;/a&gt; constraints with the same names&amp;#8230;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Added &amp;#8220;sequences&amp;#8221; for constraining the order of expected invocations. See &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Standalone.html#M000008"&gt;Standalone#sequence&lt;/a&gt; and &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000049"&gt;Expectation#in_sequence&lt;/a&gt;.&lt;/li&gt;
		&lt;li&gt;Added &amp;#8220;states&amp;#8221; for constraining the order of expected invocations. See &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Standalone.html#M000009"&gt;Standalone#states&lt;/a&gt;, &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000047"&gt;Expectation#then&lt;/a&gt;, &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000048"&gt;Expectation#when&lt;/a&gt; and &lt;a href="http://mocha.rubyforge.org/classes/Mocha/StateMachine.html"&gt;StateMachine&lt;/a&gt;.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Configurable warnings or errors&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;When a method on a non-public method is stubbed&lt;/li&gt;
		&lt;li&gt;When a method on a non-existent method is stubbed&lt;/li&gt;
		&lt;li&gt;When a method on a non-mock object is stubbed (partial mocking)&lt;/li&gt;
		&lt;li&gt;When a method is stubbed unnecessarily (i.e. the stubbed method is not called during the test)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;See &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Configuration.html"&gt;Configuration&lt;/a&gt; for more details.&lt;/p&gt;


	&lt;h2&gt;Improved error messages&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;A more readable and complete list of unsatisfied expectations, satisfied expectations and state machines.&lt;/li&gt;
		&lt;li&gt;Display more sensible failure message for any_instance expectations.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Parameter matchers&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;New to this release: &lt;a href="http://mocha.rubyforge.org/classes/Mocha/ParameterMatchers.html#M000024"&gt;optionally&lt;/a&gt; (allows matching of optional parameters if available), &lt;a href="http://mocha.rubyforge.org/classes/Mocha/ParameterMatchers.html#M000027"&gt;yaml_equivalent&lt;/a&gt; (allows matching of &lt;span class="caps"&gt;YAML&lt;/span&gt; that represents the specified object), &lt;a href="http://mocha.rubyforge.org/classes/Mocha/ParameterMatchers.html#M000026"&gt;responds_with&lt;/a&gt; (tests the quack not the duck).&lt;/li&gt;
		&lt;li&gt;Nesting of matchers is now supported.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Syntax shortcut&lt;/h2&gt;


	&lt;p&gt;An optional block can be passed into the &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Standalone.html#M000005"&gt;Standalone#mock&lt;/a&gt; method. The block is evaluated in the context of the new mock instance and can be used as a shortcut to set up expectations.&lt;/p&gt;


	&lt;h2&gt;Ruby &amp;#38; Rails compatibility&lt;/h2&gt;


	&lt;p&gt;Tested with Ruby 1.8.4, 1.8.5, 1.8.6 &amp;#38; 1.9. All related bugs and warnings believed to be fixed.&lt;/p&gt;


	&lt;p&gt;Tested with Rails 1.2.3 &amp;#38; Rails 2.1.0.&lt;/p&gt;


	&lt;h2&gt;Deprecation&lt;/h2&gt;


	&lt;p&gt;There is no longer any need to have a &amp;#8220;require &amp;#8216;stubba&amp;#8217;&amp;#8221; statement in your code. A deprecation warning has been added to this effect, because the file will be removed in a future release.&lt;/p&gt;


	&lt;h2&gt;Bug fixes&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://rubyforge.org/tracker/index.php?func=detail&amp;#38;aid=18914&amp;#38;group_id=1917&amp;#38;atid=7477"&gt;18914 in revision 296&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://rubyforge.org/tracker/index.php?func=detail&amp;#38;aid=18917&amp;#38;group_id=1917&amp;#38;atid=7477"&gt;18917 in revision 295&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://rubyforge.org/tracker/index.php?func=detail&amp;#38;aid=18336&amp;#38;group_id=1917&amp;#38;atid=7477"&gt;18336 in revision 287&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://rubyforge.org/tracker/index.php?func=detail&amp;#38;aid=17835&amp;#38;group_id=1917&amp;#38;atid=7477"&gt;17835 in revision 255&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://rubyforge.org/tracker/index.php?func=detail&amp;#38;aid=17412&amp;#38;group_id=1917&amp;#38;atid=7477"&gt;17412 in revision 242&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://rubyforge.org/tracker/index.php?func=detail&amp;#38;aid=15977&amp;#38;group_id=1917&amp;#38;atid=7477"&gt;15977 in revision 198&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://rubyforge.org/tracker/index.php?func=detail&amp;#38;aid=11885&amp;#38;group_id=1917&amp;#38;atid=7477"&gt;11885 in revision 156&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;</description>
      <pubDate>Tue, 24 Jun 2008 19:14:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:22e0bfc7-8cd0-4d92-8e72-81397544c6a1</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2008/06/24/mocha-0-9-released</link>
      <category>mocha_release</category>
      <category>mocha</category>
      <category>mock</category>
      <category>release</category>
      <category>ruby</category>
      <category>stub</category>
      <category>testing</category>
      <category>jmock</category>
    </item>
    <item>
      <title>Mocha Mailing List Move</title>
      <description>&lt;p&gt;The &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; Mailing List has moved to &lt;a href="http://groups.google.com/group/mocha-developer"&gt;Google Groups&lt;/a&gt;.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Group name: mocha-developer&lt;/li&gt;
		&lt;li&gt;Group home page: http://groups.google.com/group/mocha-developer&lt;/li&gt;
		&lt;li&gt;Group email address mocha-developer@googlegroups.com&lt;/li&gt;
	&lt;/ul&gt;</description>
      <pubDate>Thu, 19 Jun 2008 20:32:38 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:26864534-6e14-4cbf-9863-56136e675e8b</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2008/06/19/mocha-mailing-list-move</link>
      <category>ruby</category>
      <category>mock</category>
      <category>mocha</category>
      <category>mailman</category>
      <category>google</category>
      <category>group</category>
    </item>
    <item>
      <title>Mocking in Java using Mocha</title>
      <description>&lt;p&gt;&lt;a href="http://ola-bini.blogspot.com/"&gt;Ola Bini&lt;/a&gt; one of the &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; guys has released the &lt;a href="http://jtestr.codehaus.org/"&gt;JtestR&lt;/a&gt; tool which allows you to write tests for &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt; code in &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt;! Ola has bundled a number of Ruby libraries &amp;#8211; &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt;, &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt;, &lt;a href="http://dust.rubyforge.org/"&gt;Dust&lt;/a&gt;, &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html"&gt;Test::Unit&lt;/a&gt; &amp;#38; &lt;a href="http://rubyforge.org/projects/activesupport/"&gt;ActiveSupport&lt;/a&gt; &amp;#8211; together with JRuby to allow you to write Ruby test cases that test Java code.&lt;/p&gt;


	&lt;p&gt;He has a couple of examples in the &lt;a href="http://jtestr.codehaus.org/Mocks"&gt;Mock documentation&lt;/a&gt; of how to use &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt;...&lt;/p&gt;


	&lt;p&gt;The first one demonstrates using &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; to mock an interface (&lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html"&gt;Map&lt;/a&gt;).&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;java&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;util&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;Map&lt;/span&gt;
  &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;java&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;util&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;Iterator&lt;/span&gt;
  &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;java&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;util&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;Set&lt;/span&gt;
  &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;java&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;util&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;HashMap&lt;/span&gt;

  &lt;span class="ident"&gt;functional_tests&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; 
    &lt;span class="ident"&gt;test&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;that a new HashMap can be created based on another map&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; 
      &lt;span class="ident"&gt;map&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;

      &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:size&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;iter&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Iterator&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
      &lt;span class="ident"&gt;iter&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:hasNext&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Set&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
      &lt;span class="ident"&gt;set&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:iterator&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;iter&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:entrySet&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;set&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;assert_equals&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;HashMap&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;size&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;The second example demonstrates using &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; to setup expectations on a real (non-mock) instance (&lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html"&gt;HashMap&lt;/a&gt;)...&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;java&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;util&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;Iterator&lt;/span&gt;
  &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;java&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;util&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;Set&lt;/span&gt;
  &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;java&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;util&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;HashMap&lt;/span&gt;

  &lt;span class="ident"&gt;functional_tests&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; 
    &lt;span class="ident"&gt;test&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;that a new HashMap can be created based on another map&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; 
      &lt;span class="ident"&gt;map&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;HashMap&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:size&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;iter&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Iterator&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
      &lt;span class="ident"&gt;iter&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:hasNext&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Set&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
      &lt;span class="ident"&gt;set&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:iterator&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;iter&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:entrySet&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;set&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;assert_equals&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;HashMap&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;size&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 17 Feb 2008 18:10:01 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:857791bb-b4ad-41c0-845d-69d0909d0b7c</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2008/02/17/mocking-in-java-using-mocha</link>
      <category>java</category>
      <category>ruby</category>
      <category>mocha</category>
      <category>test</category>
      <category>mock</category>
    </item>
    <item>
      <title>Mock Commands, Stub Queries</title>
      <description>&lt;p&gt;&lt;a href="http://www.simplechatter.com"&gt;Zach Moazeni&lt;/a&gt; has just posted a &lt;a href="http://www.simplechatter.com/2007/8/3/mocha-and-forcing-verification"&gt;suggested patch&lt;/a&gt; for Mocha over on his blog. My understanding of the patch is that it means expectations are verified even when an assertion error occurs in the test. Here is his example&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;
  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Car&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;parts&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[])&lt;/span&gt;
      &lt;span class="attribute"&gt;@parts&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;parts&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;start&lt;/span&gt;
      &lt;span class="ident"&gt;started&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;
      &lt;span class="attribute"&gt;@parts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;part&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="comment"&gt;# commenting out for failure&lt;/span&gt;
        &lt;span class="comment"&gt;# started = started &amp;amp;&amp;amp; part.start&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;

      &lt;span class="ident"&gt;started&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;SomeTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_start&lt;/span&gt;
      &lt;span class="ident"&gt;engine_mock&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;engine_mock&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
      &lt;span class="ident"&gt;car&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Car&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;([&lt;/span&gt;&lt;span class="ident"&gt;engine_mock&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;

      &lt;span class="ident"&gt;engine_mock&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:start&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;assert&lt;/span&gt; &lt;span class="punct"&gt;!&lt;/span&gt;&lt;span class="ident"&gt;car&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;start&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;I&amp;#8217;ve had a friendly &amp;#38; useful conversation with Zach about it, but I&amp;#8217;m not convinced this is the right way to go. Using the &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=35578"&gt;one assertion per test&lt;/a&gt; school of thought, you can achieve the same goal by splitting the test into two so you get a test failure for the expectation and another for the assertion&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;
  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;SomeTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_should_start_engine&lt;/span&gt;
      &lt;span class="ident"&gt;engine&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
      &lt;span class="ident"&gt;car&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Car&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;([&lt;/span&gt;&lt;span class="ident"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;

      &lt;span class="ident"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:start&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;car&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;start&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_should_start_if_engine_starts&lt;/span&gt;
      &lt;span class="ident"&gt;engine&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;stub&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
      &lt;span class="ident"&gt;car&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Car&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;([&lt;/span&gt;&lt;span class="ident"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;

      &lt;span class="ident"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:start&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;assert&lt;/span&gt; &lt;span class="punct"&gt;!&lt;/span&gt;&lt;span class="ident"&gt;car&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;start&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Something that makes the example less suitable for mocking is that the Car#start method is both &lt;a href="http://www.jmock.org/yoga.html"&gt;a command and a query&lt;/a&gt;. If you separate the two, testing with mocks might be easier&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;
  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Car&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;parts&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[])&lt;/span&gt;
      &lt;span class="attribute"&gt;@parts&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;parts&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;start&lt;/span&gt;
      &lt;span class="attribute"&gt;@parts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;start&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;started?&lt;/span&gt;
      &lt;span class="attribute"&gt;@parts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;all?&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;started?&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;SomeOtherTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_should_start_engine&lt;/span&gt;
      &lt;span class="ident"&gt;engine&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
      &lt;span class="ident"&gt;car&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Car&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;([&lt;/span&gt;&lt;span class="ident"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;

      &lt;span class="ident"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:start&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;car&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;start&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_should_not_be_started_if_engine_is_started&lt;/span&gt;
      &lt;span class="ident"&gt;engine&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;stub&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
      &lt;span class="ident"&gt;car&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Car&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;([&lt;/span&gt;&lt;span class="ident"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;

      &lt;span class="ident"&gt;engine&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:started?&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;assert&lt;/span&gt; &lt;span class="punct"&gt;!&lt;/span&gt;&lt;span class="ident"&gt;car&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;started?&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;I&amp;#8217;d be interested to know what other people think&amp;#8230;&lt;/p&gt;


	&lt;p&gt;One thing I do agree with Zach about is that submitting a suggested patch to an open source project is a great way of initiating a constructive conversation.&lt;/p&gt;</description>
      <pubDate>Fri, 03 Aug 2007 10:10:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:22926b95-53c4-472e-9a92-4b08f504f9b7</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2007/08/03/mock-commands-stub-queries</link>
      <category>mocha</category>
      <category>mock</category>
      <category>stub</category>
      <category>testing</category>
      <category>assert</category>
      <category>verify</category>
      <category>expectation</category>
      <category>command</category>
      <category>query</category>
    </item>
    <item>
      <title>Mock Objects in Ruby</title>
      <description>&lt;p&gt;As &lt;a href="http://blog.floehopper.org/articles/2007/07/10/lrug-mocking-talk"&gt;promised&lt;/a&gt; I&amp;#8217;ve finally got round to making the &lt;a href="http://meyerweb.com/eric/tools/s5/"&gt;S5&lt;/a&gt; slides of my &lt;a href="http://www.lrug.org/meetings/2007/06/20/july-2007-meeting/"&gt;&lt;span class="caps"&gt;LRUG&lt;/span&gt; talk&lt;/a&gt; available &lt;a href="http://blog.floehopper.org/presentations/lrug-mock-objects-2007-07-09/"&gt;here&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;You can use &lt;a href="http://meyerweb.com/eric/tools/s5/features.html#controlchart"&gt;various keys&lt;/a&gt; to navigate the presentation. If you just want to quickly scan through the content, you might find the outline view useful (press the &amp;#8220;T&amp;#8221; key to toggle between slideshow &amp;#38; outline modes).&lt;/p&gt;</description>
      <pubDate>Sun, 22 Jul 2007 20:48:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:b30780d9-b0d5-4efb-9926-aac07f81c309</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2007/07/22/an-introduction-to-mock-objects-in-ruby</link>
      <category>mock</category>
      <category>object</category>
      <category>ruby</category>
      <category>mocha</category>
      <category>stub</category>
      <category>testing</category>
      <category>lrug</category>
    </item>
    <item>
      <title>Mocha 0.5 released</title>
      <description>&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;  sudo gem install mocha&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;or &lt;a href="http://rubyforge.org/frs/?group_id=1917"&gt;download&lt;/a&gt; one of the latest packages from &lt;a href="http://rubyforge.org"&gt;rubyforge&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;Parameter Matchers&lt;/h3&gt;


	&lt;p&gt;I&amp;#8217;ve added a few &lt;a href="http://code.google.com/p/hamcrest/wiki/Tutorial"&gt;Hamcrest-style&lt;/a&gt; parameter matchers which are designed to be used inside &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000021"&gt;&lt;code&gt;Expectation#with&lt;/code&gt;&lt;/a&gt;. The following matchers are currently available: anything(), includes(), has_key(), has_value(), has_entry(), all_of() &amp;#38; any_of(). More to follow soon. The idea is eventually to get rid of the nasty &lt;code&gt;parameter_block&lt;/code&gt; option on &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000021"&gt;&lt;code&gt;Expectation#with&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;with&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;has_key&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;key_1&lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;key_1&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;key_2&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="comment"&gt;# no verification error raised&lt;/span&gt;

  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;with&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;has_key&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;key_1&lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;key_2&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="comment"&gt;# verification error raised, because method was not called with Hash containing key: 'key_1'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h3&gt;Values Returned and Exceptions Raised on Consecutive Invocations&lt;/h3&gt;


	&lt;p&gt;Allow multiple calls to &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000024"&gt;&lt;code&gt;Expectation#returns&lt;/code&gt;&lt;/a&gt; and &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000025"&gt;&lt;code&gt;Expectation#raises&lt;/code&gt;&lt;/a&gt; to build up a sequence of responses to invocations on the mock. Added syntactic sugar method &lt;code&gt;Expectation#then&lt;/code&gt; to allow more readable expectations.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;then&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;raises&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Exception&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;then&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 2&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; raises exception of class Exception&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h3&gt;Yields on Consecutive Invocations&lt;/h3&gt;


	&lt;p&gt;Allow multiple calls to yields on single expectation to allow yield parameters to be specified for consecutive invocations.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;yields&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;then&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;yields&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|*&lt;/span&gt;&lt;span class="ident"&gt;values&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="ident"&gt;values&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; [1, 2]&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|*&lt;/span&gt;&lt;span class="ident"&gt;values&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="ident"&gt;values&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; [3]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h3&gt;Multiple Yields on Single Invocation&lt;/h3&gt;


	&lt;p&gt;Added &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000023"&gt;&lt;code&gt;Expectation#multiple_yields&lt;/code&gt;&lt;/a&gt; to allow a mocked or stubbed method to yield multiple times for a single invocation.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;multiple_yields&lt;/span&gt;&lt;span class="punct"&gt;([&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|*&lt;/span&gt;&lt;span class="ident"&gt;values&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="ident"&gt;values&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; [1, 2] # =&amp;gt; [3]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h3&gt;Invocation Dispatch&lt;/h3&gt;


	&lt;p&gt;Expectations were already being matched in reverse order i.e. the most recently defined one was being found first. This is still the case, but we now stop matching an expectation when its maximum number of expected invocations is reached. c.f. &lt;a href="http://www.jmock.org/jmock1-dispatch.html"&gt;JMock v1&lt;/a&gt;. A stub will never stop matching by default. Hopefully this means we can soon get rid of the need to pass a &lt;code&gt;Proc&lt;/code&gt; to &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000024"&gt;&lt;code&gt;Expectation#returns&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;once&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 2&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 2&lt;/span&gt;
  &lt;span class="comment"&gt;# no verification error raised&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This should still work&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:now&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Mon Jan 01 00:00:00 UTC 2007&lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;
  &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; Mon Jan 01 00:00:00 UTC 2007&lt;/span&gt;
  &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:now&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Thu Feb 01 00:00:00 UTC 2007&lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;
  &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; Thu Feb 01 00:00:00 UTC 2007&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h3&gt;Acknowledgements&lt;/h3&gt;


	&lt;p&gt;Thanks to David Chelimsky, Dan North, Jay Fields, Kevin Clark, Frederick Cheung, James Moore, Brian Helmkamp, Ben Griffiths, Chris Roos &amp;#38; Paul Battley for their input. Apologies to anybody I forgot to mention.&lt;/p&gt;</description>
      <pubDate>Fri, 08 Jun 2007 15:46:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:fa9f8740-ed2c-4f13-a1f6-3d2244dcb06f</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2007/06/08/mocha-0-5-released</link>
      <category>mocha_release</category>
      <category>mocha</category>
      <category>release</category>
      <category>mock</category>
      <category>stub</category>
      <category>testing</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Honourable Mention for Mocha</title>
      <description>&lt;p&gt;I just downloaded an updated version of the Pragmatic Bookshelf&amp;#8217;s &lt;a href="http://www.pragmaticprogrammer.com/titles/rails/"&gt;Agile Web Development with Rails&lt;/a&gt; book. Maybe it&amp;#8217;s been there a while, but I just noticed &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; is mentioned at the end of the chapter on testing. :-)&lt;/p&gt;</description>
      <pubDate>Thu, 10 May 2007 15:15:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:439a505e-7e69-43a3-8e71-ffb789b99ca3</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2007/05/10/honourable-mention-for-mocha</link>
      <category>mocha</category>
      <category>mock</category>
      <category>stub</category>
      <category>agile</category>
      <category>pragmatic</category>
      <category>book</category>
    </item>
    <item>
      <title>Preview of Latest Mocha Changes</title>
      <description>&lt;p&gt;I&amp;#8217;ve finally managed to find some time to do some serious work on &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt;. Here are some code snippets showing the new functionality available in trunk (revision 128). I don&amp;#8217;t don&amp;#8217;t know how many people out there are using trunk, but it would be great to get some feedback on these changes before I make a new release. In particular I&amp;#8217;d like to know whether&amp;#8230;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;I&amp;#8217;ve broken anybody&amp;#8217;s tests.&lt;/li&gt;
		&lt;li&gt;Anybody has a legitimate use for &lt;code&gt;parameter_block&lt;/code&gt; in &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000017"&gt;&lt;code&gt;Expectation#with&lt;/code&gt;&lt;/a&gt; that they don&amp;#8217;t think will be handled by a suitable parameter matcher i.e. using the current behaviour where the block is passed the parameters and the result of the block determines whether the expectation matches. I&amp;#8217;m planning on deprecating this soon.&lt;/li&gt;
		&lt;li&gt;Anybody has a legitimate use for passing in an instance of &lt;code&gt;Proc&lt;/code&gt; to &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000019"&gt;&lt;code&gt;Expectation#returns&lt;/code&gt;&lt;/a&gt; i.e. using the current behaviour where the &lt;code&gt;Proc&lt;/code&gt; gets executed to generate a return value. I&amp;#8217;m planning on deprecating this soon as well.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I&amp;#8217;ve typed this up in a bit of a rush (about to go on holiday for a few days), so apologies if there are any mistakes.&lt;/p&gt;


	&lt;h3&gt;Parameter Matchers&lt;/h3&gt;


	&lt;p&gt;I&amp;#8217;ve added a few &lt;a href="http://code.google.com/p/hamcrest/wiki/Tutorial"&gt;Hamcrest-style&lt;/a&gt; parameter matchers which are designed to be used inside &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000017"&gt;&lt;code&gt;Expectation#with&lt;/code&gt;&lt;/a&gt;. The following matchers are currently available: has_key(), has_value() &amp;#38; has_entry(). More to follow soon. The idea is eventually to get rid of the nasty &lt;code&gt;parameter_block&lt;/code&gt; option on &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000017"&gt;&lt;code&gt;Expectation#with&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;with&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;has_key&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;key_1&lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;key_1&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;key_2&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="comment"&gt;# no verification error raised&lt;/span&gt;

  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;with&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;has_key&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;key_1&lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;key_2&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="comment"&gt;# verification error raised, because method was not called with Hash containing key: 'key_1'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h3&gt;Values Returned and Exceptions Raised on Consecutive Invocations&lt;/h3&gt;


	&lt;p&gt;Allow multiple calls to &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000019"&gt;&lt;code&gt;Expectation#returns&lt;/code&gt;&lt;/a&gt; and &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000020"&gt;&lt;code&gt;Expectation#raises&lt;/code&gt;&lt;/a&gt; to build up a sequence of responses to invocations on the mock. Added syntactic sugar method &lt;code&gt;Expectation#then&lt;/code&gt; to allow more readable expectations.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;then&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;raises&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Exception&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;then&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 2&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; raises exception of class Exception&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h3&gt;Yields on Consecutive Invocations&lt;/h3&gt;


	&lt;p&gt;Allow multiple calls to yields on single expectation to allow yield parameters to be specified for consecutive invocations.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;yields&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;then&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;yields&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|*&lt;/span&gt;&lt;span class="ident"&gt;values&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="ident"&gt;values&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; [1, 2]&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|*&lt;/span&gt;&lt;span class="ident"&gt;values&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="ident"&gt;values&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; [3]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h3&gt;Multiple Yields on Single Invocation&lt;/h3&gt;


	&lt;p&gt;Added &lt;code&gt;Expectation#multiple_yields&lt;/code&gt; to allow a mocked or stubbed method to yield multiple times for a single invocation.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;multiple_yields&lt;/span&gt;&lt;span class="punct"&gt;([&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|*&lt;/span&gt;&lt;span class="ident"&gt;values&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="ident"&gt;values&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; [1, 2] # =&amp;gt; [3]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h3&gt;Invocation Dispatch&lt;/h3&gt;


	&lt;p&gt;Expectations were already being matched in reverse order i.e. the most recently defined one was being found first. This is still the case, but we now stop matching an expectation when its maximum number of expected invocations is reached. c.f. &lt;a href="http://www.jmock.org/jmock1-dispatch.html"&gt;JMock v1&lt;/a&gt;. A stub will never stop matching by default. Hopefully this means we can soon get rid of the need to pass a &lt;code&gt;Proc&lt;/code&gt; to &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html#M000019"&gt;&lt;code&gt;Expectation#returns&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;once&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 2&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 2&lt;/span&gt;
  &lt;span class="comment"&gt;# no verification error raised&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This should still work&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:now&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Mon Jan 01 00:00:00 UTC 2007&lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;
  &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; Mon Jan 01 00:00:00 UTC 2007&lt;/span&gt;
  &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:now&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Thu Feb 01 00:00:00 UTC 2007&lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;
  &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; Thu Feb 01 00:00:00 UTC 2007&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h3&gt;Acknowledgements&lt;/h3&gt;


	&lt;p&gt;Thanks to David Chelimsky, Dan North, Jay Fields, Kevin Clark, Frederick Cheung, James Moore, Brian Helmkamp, Ben Griffiths, Chris Roos &amp;#38; Paul Battley for their input. Apologies to anybody I forgot to mention.&lt;/p&gt;</description>
      <pubDate>Thu, 12 Apr 2007 11:57:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:b8fe8b5f-8502-4d35-bc10-e6ba29cfddae</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2007/04/12/preview-of-latest-mocha-changes</link>
      <category>ruby</category>
      <category>mocha</category>
      <category>preview</category>
      <category>mock</category>
      <category>stub</category>
      <category>return</category>
      <category>raise</category>
      <category>yield</category>
    </item>
  </channel>
</rss>
