<?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>Object Mentor Blog: Mocking Mocking and Testing Outcomes.</title>
    <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Mocking Mocking and Testing Outcomes.</title>
      <description>&lt;p&gt;The number of mocking frameworks has proliferated in recent years.  This pleases me because it is a symptom that testing in general, and &lt;span class="caps"&gt;TDD&lt;/span&gt; in particular, have become prevalent enough to support a rich panoply of third-party products.&lt;/p&gt;


	&lt;p&gt;On the other hand, all frameworks carry a disease with them that I call &lt;em&gt;The Mount Everest Syndrome&lt;/em&gt;: &amp;#8220;I use it because it&amp;#8217;s there.&amp;#8221;  The more mocking frameworks that appear, the more I see them enthusiastically used.  Yet the prolific use of mocking frameworks is a rather serious design smell&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Lately I have seen several books and articles that present &lt;span class="caps"&gt;TDD&lt;/span&gt; through the lens of a mocking framework.  If you were a newbie to &lt;span class="caps"&gt;TDD&lt;/span&gt;, these writings might give you the idea that &lt;span class="caps"&gt;TDD&lt;/span&gt; was defined by the use of mocking tools, rather than by the &lt;a href="http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd"&gt;disciplines&lt;/a&gt; of &lt;span class="caps"&gt;TDD&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;So when should use use a mocking framework?  The answer is the same for any other framework.  You use a framework only when that framework will give you a significant advantage.&lt;/p&gt;


	&lt;p&gt;Why so austere?  Why shouldn&amp;#8217;t you use frameworks &amp;#8220;just because they are there&amp;#8221;?  Because frameworks &lt;em&gt;always&lt;/em&gt; come with a cost.  They must be learned by the author, and by all the readers.  They become part of the configuration and have to be maintained.  They must be tracked from version to version.  But perhaps the most significant reason is that once you have a hammer, everything starts to look like a nail.  The framework will put you into a constraining mindset that prevents you from seeing other, better solutions.&lt;/p&gt;


Consider, for example, this lovely bit of code that I&amp;#8217;ve been reviewing recently.  It uses the Moq framework to initialize a test double:
&lt;pre&gt;&lt;code&gt;
var vehicleMock = Mocks.Create&amp;lt;IClientVehicle&amp;gt;()
 .WithPersistentKey()
 .WithLogicalKey().WithLogicalName()
 .WithRentalSessionManager(rsm =&amp;gt;
    {
      var rs = Mocks.Create&amp;lt;IRentalSession&amp;gt;();
      rsm.Setup(o =&amp;gt; o.GetCurrentSession()).Returns(rs.Object);
      rsm.Setup(o =&amp;gt;
       o.GetLogicalKeyOfSessionMember(It.IsAny&amp;lt;string&amp;gt;(),
        It.IsAny&amp;lt;int&amp;gt;())).Returns("Rental");
    })
 .AddVehicleMember&amp;lt;IRoadFactory&amp;gt;()
 .AddVehicleMember&amp;lt;IRoadItemFactory&amp;gt;(rf =&amp;gt; rf.Setup(t =&amp;gt; 
    t.CreateItems(It.IsAny&amp;lt;IRoad&amp;gt;())).Returns(pac))
 .AddVehicleMember&amp;lt;ILegacyCorporateRental&amp;gt;()
 .AddVehicleMember&amp;lt;IRentalStation&amp;gt;(
    m =&amp;gt; m.Setup(k =&amp;gt; k.Facility.FacilityID).Returns(0))
 .AddVehicleMember&amp;lt;IRoadManager&amp;gt;(m=&amp;gt;
    m.Setup(k=&amp;gt;k.GetRoundedBalanceDue(25,It.IsAny&amp;lt;IRoad&amp;gt;())).Returns(25));
&lt;/code&gt;&lt;/pre&gt;
Some of you might think I&amp;#8217;m setting up a straw-man.  I&amp;#8217;m not.  I realize that bad code can be written in any language or framework, and that you can&amp;#8217;t blame the language or framework for bad code.  
&lt;p/&gt;&lt;p/&gt;
The point I am making is that code like this was &lt;em&gt;the way&lt;/em&gt; that all unit tests in this application were written.  The team was new to &lt;span class="caps"&gt;TDD&lt;/span&gt;, and they got hold of a tool, and perhaps read a book or article, and decided that &lt;span class="caps"&gt;TDD&lt;/span&gt; was done by using a mocking tool.  This team is not the first team I&amp;#8217;ve seen who have fallen into this trap.  In fact, I think that the &lt;span class="caps"&gt;TDD&lt;/span&gt; industry as a whole has fallen into this trap to one degree or another.

	&lt;p&gt;Now don&amp;#8217;t get me wrong.  I like mocking tools.  I use them in Ruby, Java, and .Net. I think they provide a convenient way to make test-doubles in situations where more direct means are difficult.&lt;/p&gt;


For example, I recently wrote the following unit test in FitNesse using the Mockito framework.  
&lt;pre&gt;&lt;code&gt;
  @Before
  public void setUp() {
    manager = mock(GSSManager.class);
    properties = new Properties();
  }

  @Test
  public void credentialsShouldBeNullIfNoServiceName() throws Exception {
    NegotiateAuthenticator authenticator = 
      new NegotiateAuthenticator(manager, properties);
    assertNull(authenticator.getServerCredentials());
    verify(manager, never()).createName(
      anyString(), (Oid) anyObject(), (Oid) anyObject());
  }
&lt;/code&gt;&lt;/pre&gt;
The first line in the &lt;code&gt;setUp&lt;/code&gt; function is lovely.  It&amp;#8217;s kind of hard to get prettier than that.  Anybody reading it understands that &lt;code&gt;manager&lt;/code&gt; will be a mock of the &lt;code&gt;GSSManager&lt;/code&gt; class.  
&lt;p/&gt;&lt;p/&gt;
It&amp;#8217;s not too hard to understand the test itself.  Apparently we are happy to have the &lt;code&gt;manager&lt;/code&gt; be a dummy object with the constraint that &lt;code&gt;createName&lt;/code&gt; is never called by &lt;code&gt;NegotiateAuthenticator&lt;/code&gt;.  The &lt;code&gt;anyString()&lt;/code&gt; and &lt;code&gt;anyObject()&lt;/code&gt; calls are pretty self explanatory.

	&lt;p&gt;On the other hand, I wish I could have said this:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;assertTrue(manager.createNameWasNotCalled());&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;That statement does not require my poor readers to understand anything about Mockito.  Of course it does require me to hand-roll a manager mock.  Would that be hard?  Let&amp;#8217;s try.&lt;/p&gt;


First I need to create a dummy.  
&lt;pre&gt;&lt;code&gt;
  private class MockGSSManager extends GSSManager {
    public Oid[] getMechs() {
      return new Oid[0];
    }

    public Oid[] getNamesForMech(Oid oid) throws GSSException {
      return new Oid[0];
    }

    public Oid[] getMechsForName(Oid oid) {
      return new Oid[0];
    }

    public GSSName createName(String s, Oid oid) throws GSSException {
      return null;
    }

    public GSSName createName(byte[] bytes, Oid oid) throws GSSException {
      return null;
    }

    public GSSName createName(String s, Oid oid, Oid oid1) throws GSSException {
      return null;
    }

    public GSSName createName(byte[] bytes, Oid oid, Oid oid1) throws GSSException {
      return null;
    }

    public GSSCredential createCredential(int i) throws GSSException {
      return null;
    }

    public GSSCredential createCredential(GSSName gssName, int i, Oid oid, int i1) throws GSSException {
      return null;
    }

    public GSSCredential createCredential(GSSName gssName, int i, Oid[] oids, int i1) throws GSSException {
      return null;
    }

    public GSSContext createContext(GSSName gssName, Oid oid, GSSCredential gssCredential, int i) throws GSSException {
      return null;
    }

    public GSSContext createContext(GSSCredential gssCredential) throws GSSException {
      return null;
    }

    public GSSContext createContext(byte[] bytes) throws GSSException {
      return null;
    }

    public void addProviderAtFront(Provider provider, Oid oid) throws GSSException {
    }

    public void addProviderAtEnd(Provider provider, Oid oid) throws GSSException {
    }
  }
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;&amp;#8220;Oh, ick!&amp;#8221; you say.  Yes, I agree it&amp;#8217;s a lot of code.  On the other hand, it took me just a single keystroke on my &lt;span class="caps"&gt;IDE&lt;/span&gt; to generate all those dummy methods.  (In IntelliJ it was simply command-I to implement all unimplemented methods.)  So it wasn&amp;#8217;t particularly hard.  And, of course, I can put this code somewhere where nobody had to look at it unless they want to.  It has the advantage that anybody who knows Java can understand it, and can look right at the methods to see what they are returning.  No &amp;#8220;special&amp;#8221; knowledge of the mocking framework is necessary.&lt;/p&gt;


Next, let&amp;#8217;s&amp;#8217; make a test double that does precisely what this test needs.
&lt;pre&gt;&lt;code&gt;
  private class GSSManagerSpy extends MockGSSManager {
    public boolean createNameWasCalled;

    public GSSName createName(String s, Oid oid) throws GSSException {
      createNameWasCalled = true;
      return null;
    }
  }
&lt;/code&gt;&lt;/pre&gt;
Well, that just wasn&amp;#8217;t that hard.  It&amp;#8217;s really easy to understand too. 

Now, let&amp;#8217;s rewrite the test.
&lt;pre&gt;&lt;code&gt;
  @Test
  public void credentialsShouldBeNullIfNoServiceNameWithHandRolledMocks() throws Exception {
    NegotiateAuthenticator authenticator = new NegotiateAuthenticator(managerSpy, properties);
    assertNull(authenticator.getServerCredentials());
    assertFalse(managerSpy.createNameWasCalled);
  }
&lt;/code&gt;&lt;/pre&gt;
Well, that test is just a &lt;em&gt;load&lt;/em&gt; easier to read than &lt;code&gt;verify(manager, never()).createName(anyString(), (Oid) anyObject(), (Oid) anyObject());&lt;/code&gt;.
&lt;p/&gt;&lt;p/&gt;
&amp;#8220;But Uncle Bob!&amp;#8221; I hear you say.  &amp;#8220;That scenario is too simple.  What if there were lots of dependencies and things&amp;#8230;&amp;#8221; 

I&amp;#8217;m glad you asked that question, because the very next test is just such a situation.  
&lt;pre&gt;&lt;code&gt;
  @Test
  public void credentialsShouldBeNonNullIfServiceNamePresent() throws Exception {
    properties.setProperty("NegotiateAuthenticator.serviceName", "service");
    properties.setProperty("NegotiateAuthenticator.serviceNameType", "1.1");
    properties.setProperty("NegotiateAuthenticator.mechanism", "1.2");
    GSSName gssName = mock(GSSName.class);
    GSSCredential gssCredential = mock(GSSCredential.class);
    when(manager.createName(anyString(), (Oid) anyObject(), (Oid) anyObject())).thenReturn(gssName);
    when(manager.createCredential((GSSName) anyObject(), anyInt(), (Oid) anyObject(), anyInt())).thenReturn(gssCredential);
    NegotiateAuthenticator authenticator = new NegotiateAuthenticator(manager, properties);
    Oid serviceNameType = authenticator.getServiceNameType();
    Oid mechanism = authenticator.getMechanism();
    verify(manager).createName("service", serviceNameType, mechanism);
    assertEquals("1.1", serviceNameType.toString());
    assertEquals("1.2", mechanism.toString());
    verify(manager).createCredential(gssName, GSSCredential.INDEFINITE_LIFETIME, mechanism, GSSCredential.ACCEPT_ONLY);
    assertEquals(gssCredential, authenticator.getServerCredentials());
  }
&lt;/code&gt;&lt;/pre&gt;
Now I&amp;#8217;ve got three test doubles that interact with each other; and I am verifying that the code under test is manipulating them all correctly.  I &lt;em&gt;could&lt;/em&gt; create hand-rolled test doubles for this; but the wiring between them would be scattered in the various test-double derivatives.  I&amp;#8217;d also have to write a significant number of accessors to get the values of the arguments to &lt;code&gt;createName&lt;/code&gt; and &lt;code&gt;createCredential&lt;/code&gt;.  In short, the hand-rolled test-double code would be harder to understand than the Mockito code.  The Mockito code puts the whole story in one simple test method rather than scattering it hither and yon in a plethora of little derivatives.
&lt;p/&gt;&lt;p/&gt;
What&amp;#8217;s more, since it&amp;#8217;s clear that I should use a mocking framework for this test, I think I should be consistent and use if for &lt;em&gt;all&lt;/em&gt; the tests in this file.   So the hand-rolled &lt;code&gt;MockGSSManager&lt;/code&gt; and &lt;code&gt;ManagerSpy&lt;/code&gt; are history.

	&lt;p&gt;&amp;#8220;But Uncle Bob, aren&amp;#8217;t we always going to have dependencies like that?  So aren&amp;#8217;t we &lt;em&gt;always&lt;/em&gt; going to have to use a mocking framework?&amp;#8221;&lt;/p&gt;


	&lt;p&gt;That, my dear reader, is the real point of this blog.  The answer to that salient questions is a profound: &amp;#8220;&lt;strong&gt;No!&lt;/strong&gt;&amp;#8220;&lt;/p&gt;


	&lt;p&gt;Why did I have to use Mockito for these tests?  Because the number of objects in play was large.  The module under test (&lt;code&gt;NegotiateAuthenticator&lt;/code&gt;) used &lt;code&gt;GSSName&lt;/code&gt;, &lt;code&gt;GSSCredential&lt;/code&gt;, and &lt;code&gt;GSSManager&lt;/code&gt;.  In other words the coupling between the module under test and the test itself was high.  (I see lightbulbs above some of your heads.) That&amp;#8217;s right, boys and girls, we don&amp;#8217;t want coupling to be high!&lt;/p&gt;


	&lt;p&gt;It is the high coupling between modules and tests that creates the need for a mocking framework.  This high coupling is also the cause of the dreaded &amp;#8220;Fragile Test&amp;#8221; problem.  How many tests break when you change a module?  If the number is high, then the coupling between your modules and tests in high.  Therefore, I conclude that those systems that make prolific use of mocking frameworks are likely to suffer from fragile tests.&lt;/p&gt;


	&lt;p&gt;Of the 277 unit test files in FitNesse, only 11 use Mockito.  The reason for small number is two-fold.  First, we test outcomes more often than we test mechanisms.  That means we test how a small group of classes behaves, rather than testing the dance of method calls between those classes.  The second reason is that our test doubles have no middle class.  They are either very simple stubs and spies or they are moderately complex fakes.&lt;/p&gt;


	&lt;p&gt;Testing outcomes is a traditional decoupling technique.  The test doesn&amp;#8217;t care &lt;em&gt;how&lt;/em&gt; the end result is calculated, so long as the end result is correct.  There may be a dance of several method calls between a few different objects; but the test is oblivious since it only checks the answer.  Therefore the tests are not strongly coupled to the solution and are not fragile.&lt;/p&gt;


	&lt;p&gt;Keeping middle-class test doubles (i.e. Mocks) to a minimum is another way of decoupling.  Mocks, by their very nature, are coupled to mechanisms instead of outcomes.  Mocks, or the setup code that builds them, have deep knowledge of the inner workings of several different classes.  That knowledge is the very definition of high-coupling.&lt;/p&gt;


	&lt;p&gt;What is a &amp;#8220;moderately complex fake&amp;#8221; and why does it help to reduce coupling?  One example within FitNesse is &lt;code&gt;MockSocket&lt;/code&gt;.  (The name of this class is historical.  Nowadays it should be called &lt;code&gt;FakeSocket&lt;/code&gt;.)  This class derives from &lt;code&gt;Socket&lt;/code&gt; and implements all its methods either to remember what was sent to the socket, or to allow a user to read some canned data.  This is a &amp;#8220;fake&amp;#8221; because it simulates the behavior of a socket.  It is not a mock because it has no coupling to any mechanisms.  You don&amp;#8217;t ask it whether it succeeded or failed, you ask it to send or recieve a string.  This allows our unit tests to test outcomes rather than mechanisms.&lt;/p&gt;


	&lt;p&gt;The moral of this story is that the point at which you start to really need a mocking framework is the very point at which the coupling between your tests and code is getting too high.  There are times when you can&amp;#8217;t avoid this coupling, and those are the times when mocking frameworks &lt;em&gt;really&lt;/em&gt; pay off.  However, you should strive to keep the coupling between your code and tests low enough that you don&amp;#8217;t need to use the mocking framework very often.&lt;/p&gt;


	&lt;p&gt;You do this by testing outcomes instead of mechanisms.&lt;/p&gt;</description>
      <pubDate>Sat, 23 Jan 2010 11:32:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:b863ec60-399c-430f-8e82-78e54684cae4</guid>
      <author>Uncle Bob</author>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes</link>
      <category>Uncle Bob's Blatherings</category>
      <category>Design Principles</category>
      <category>Clean Code</category>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Android News</title>
      <description>&lt;p&gt;Thank you.&lt;/p&gt;


	&lt;p&gt;I recentlly had an eye opener at work, where I was shown how our extensive use of Rhino Mock&#8217;s garbled the readability of our testing.&lt;/p&gt;


	&lt;p&gt;After rewriting the test without Rhino mock&#8217;s it became apparent to me, how our learned behaviour to use mocks as much as we did affected the quality of our testing code.&lt;/p&gt;


	&lt;p&gt;I&#8217;m now looking at mocking suspiciously.&lt;/p&gt;</description>
      <pubDate>Sat, 21 Jan 2012 01:47:46 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:b8f696b6-f80b-44a6-8853-ddcb18ff2bb6</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-198729</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by free cell phone spy</title>
      <description>&lt;p&gt;This is a very informative article.I was looking for these things and here I found it. I am doing a project and this information is very useful me. I always try to find information and hopefully I found more about what I am locking for..!&lt;/p&gt;</description>
      <pubDate>Wed, 18 Jan 2012 02:25:21 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:e5bd9d44-3b26-46f3-86e5-b7180719eead</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-198444</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by iPhone contacts backup</title>
      <description>&lt;p&gt;How many people understand this? it is a good choice to make a copy of it and save it on computer. We can retrieve them when necessary.&lt;/p&gt;</description>
      <pubDate>Mon, 09 Jan 2012 00:14:35 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:c7a95e5c-c952-4e32-a97f-443049451e2f</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-196106</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by nikeheelsdunk</title>
      <description>&lt;br&gt;&lt;br&gt;A first aid kit is a must for small and accidental injuries. Of course it&amp;#8217;s unavoidable to scrape your arm on rough bark or falling off the tree stand, at least there&amp;#8217;s an available remedy in that box. Always make sure to dispose of the &lt;a href="http://www.nikewomenheels.net/" rel="nofollow"&gt;Nike heels for women&lt;/a&gt; material properly.&lt;br&gt;&lt;br&gt;Other equipment such as rifles or bows must be kept unloaded. Most States will commission a guide for hunters to carry the ammunition and probably help the hunter carry some of the necessary equipment. It&amp;#8217;s not like having a &lt;a href="http://www.jordanheelswomen.net/" rel="nofollow"&gt;Jordan Heels For Women&lt;/a&gt; caddy carrying the bag, but he is there to ensure the safety of the hunter as well as the forest.&lt;br&gt;&lt;br&gt;Never drink anything that may compromise or deteriorate your physical or mental faculties.</description>
      <pubDate>Mon, 26 Dec 2011 02:48:43 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:829429b0-874e-4a46-9061-9645c31ef39f</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-192167</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by nikeheelsdunk</title>
      <description>&lt;br&gt;&lt;br&gt;A first aid kit is a must for small and accidental injuries. Of course it&amp;#8217;s unavoidable to scrape your arm on rough bark or falling off the tree stand, at least there&amp;#8217;s an available remedy in that box. Always make sure to dispose of the &lt;a href="http://www.nikewomenheels.net/" rel="nofollow"&gt;Nike heels for women&lt;/a&gt; material properly.&lt;br&gt;&lt;br&gt;Other equipment such as rifles or bows must be kept unloaded. Most States will commission a guide for hunters to carry the ammunition and probably help the hunter carry some of the necessary equipment. It&amp;#8217;s not like having a &lt;a href="http://www.jordanheelswomen.net/" rel="nofollow"&gt;Jordan Heels For Women&lt;/a&gt; caddy carrying the bag, but he is there to ensure the safety of the hunter as well as the forest.&lt;br&gt;&lt;br&gt;Never drink anything that may compromise or deteriorate your physical or mental faculties.</description>
      <pubDate>Mon, 26 Dec 2011 02:48:14 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:588d4155-f011-4f32-988f-8d3c747dfb32</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-192161</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by hAllohi</title>
      <description>&lt;p&gt;The best social network&amp;#8230;..&lt;/p&gt;</description>
      <pubDate>Mon, 19 Dec 2011 17:17:45 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:4e15823c-fc9a-45b0-9534-b1be3a306fb4</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-189575</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by tv show</title>
      <description>&lt;p&gt;very interesting article. thanks alot for sharing and keep up the good work!&lt;/p&gt;


	&lt;p&gt;best r,
Danielle&lt;/p&gt;</description>
      <pubDate>Sat, 26 Nov 2011 09:48:17 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:e4b4fae6-3476-4c7b-b5a5-3f89a32e393c</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-178745</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Haseeb</title>
      <description>&lt;p&gt;object mentor is very nice and there are number of frameworks so it is very good for me and for my friends.&lt;/p&gt;


	&lt;p&gt;&lt;b&gt;&lt;a href="http://pipistrelaircraft.com/index.html" rel="nofollow"&gt;aircraft for sale in Ireland&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 09 Nov 2011 12:42:21 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:f97a87b4-8880-4640-80c6-20173ae3da13</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-170616</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Jools</title>
      <description>&lt;p&gt;:) I understand that Moq is supposed to be simple to use &amp;#8211; but after 2 hours I am dropping this thing &amp;#8211; something goes wrong all the time :/&lt;/p&gt;


	&lt;p&gt;anyway, tx for sharing
Jools&lt;/p&gt;</description>
      <pubDate>Tue, 08 Nov 2011 10:47:53 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:8e6840bd-d041-4452-bad8-7cd23b3c675d</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-169999</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Wiphone</title>
      <description>&lt;p&gt;Some of you might think I&#8217;m setting up a straw-man. I&#8217;m not. I realize that bad code can be written in any language or framework, and that you can&#8217;t blame the language or framework for bad code.&lt;/p&gt;


	&lt;p&gt;The point I am making is that code like this was the way that all unit tests in this application were written. The team was new to TDD, and they got hold of a tool, and perhaps read a book or article, and decided that TDD was done by using a mocking tool. This team is not the first team I&#8217;ve seen who have fallen into this trap. In fact, I think that the TDD industry as a whole has fallen into this trap to one degree or another.&lt;/p&gt;</description>
      <pubDate>Sun, 06 Nov 2011 05:03:45 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:7f7b670d-3fca-4228-a66b-5ca26564cb55</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-168906</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Free Download Website</title>
      <description>&lt;p&gt;Such a wonderful post. Thanks for sharing this blog post.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://tdkhoa.net/best-status/" rel="nofollow"&gt;Status ngau hung&lt;/a&gt; of  &lt;a href="http://tdkhoa.net" rel="nofollow"&gt;Tran Dang Khoa&lt;/a&gt; | &lt;a href="http://www.6downs.com" rel="nofollow"&gt;Free Download&lt;/a&gt; |  &lt;a href="http://www.6downs.com" rel="nofollow"&gt;Free Download Website&lt;/a&gt; | &lt;a href="http://www.minhu.vn" rel="nofollow"&gt;Unlock dien thoai nhat&lt;/a&gt; | &lt;a href="http://www.minhu.vn" rel="nofollow"&gt;dien thoai nhat&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 06 Nov 2011 04:53:09 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:2974e97e-af81-4c29-9279-36313c7c8b2b</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-168901</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Download Android Apps</title>
      <description>&lt;p&gt;Interesting article and one which should be more widely known about in my view. Your level of detail is good and the clarity of writing is excellent. I have bookmarked it for you so that others will be able to see what you have to say&lt;/p&gt;</description>
      <pubDate>Wed, 02 Nov 2011 20:47:54 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:5b973f27-db9d-4181-bebc-e9d3614780d0</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-166981</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Andy Yousuf</title>
      <description>&lt;p&gt;Learning a framework to the core is definitely a hard task!
&lt;strong&gt;&lt;a href="http://loves-writing-articles.weebly.com/my-blog-articles.html" rel="nofollow"&gt;loves writing articles&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 31 Oct 2011 09:30:42 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:de199627-4936-4527-85f4-b9929fc4bdc5</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-166267</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by xsw123</title>
      <description>&lt;p&gt;&lt;a href="http://www.burberry-brand.com/index.php?main_page=index&amp;#38;cPath=4" rel="nofollow"&gt; &lt;strong&gt;??? ???&lt;/strong&gt;&lt;/a&gt;?1856???????????
 ????????1835??????????? 1924??&amp;#8221;&lt;a href="http://www.burberry-brand.com/index.php?main_page=index&amp;#38;cPath=1" rel="nofollow"&gt; &lt;strong&gt;??? ?&lt;/strong&gt;&lt;/a&gt;???&amp;#8221;???????????????????????????&lt;a href="http://www.burberry-brand.com" rel="nofollow"&gt; &lt;strong&gt;??????&lt;/strong&gt;&lt;/a&gt;?????&lt;a href="http://www.burberry-brand.com/index.php?main_page=index&amp;#38;cPath=2" rel="nofollow"&gt; &lt;strong&gt;??? ?&lt;/strong&gt;&lt;/a&gt; (&lt;a href="http://www.burberry-brand.com" rel="nofollow"&gt; &lt;strong&gt; Burberry&lt;/strong&gt;&lt;/a&gt;)&lt;a href="http://www.burberry-brand.com/index.php?main_page=index&amp;#38;cPath=3" rel="nofollow"&gt; &lt;strong&gt;??? ??&lt;/strong&gt;&lt;/a&gt;????1856?????????&lt;a href="http://www.burberry-brand.com/index.php?main_page=index&amp;#38;cPath=5" rel="nofollow"&gt; &lt;strong&gt;??? ??&lt;/strong&gt;&lt;/a&gt;??????????&lt;a href="http://www.burberry-brand.com" rel="nofollow"&gt; &lt;strong&gt;??? &lt;/strong&gt;&lt;/a&gt;??????????????????? ????????????&lt;a href="http://www.burberry-brand.com" rel="nofollow"&gt; &lt;strong&gt;?&lt;/strong&gt;&lt;/a&gt; ???????????&lt;a href="http://www.burberry-brand.com" rel="nofollow"&gt; &lt;strong&gt;??? ???&lt;/strong&gt;&lt;/a&gt;.
&lt;br&gt;
&lt;a href="http://www.outletmoncler2.com/index.php?main_page=index&amp;#38;cPath=1&amp;#38;zenid=9a1f1e47f8d06d6dcbd514ba36a181a0" rel="nofollow"&gt; &lt;strong&gt;?? ?&lt;/strong&gt;&lt;/a&gt;?&lt;a href="http://www.outletmoncler2.com " rel="nofollow"&gt; &lt;strong&gt;????&lt;/strong&gt;&lt;/a&gt;???????????&lt;a href="http://www.outletmoncler2.com/index.php?main_page=index&amp;#38;cPath=2&amp;#38;zenid=9a1f1e47f8d06d6dcbd514ba36a181a0" rel="nofollow"&gt; &lt;strong&gt;?? ??&lt;/strong&gt;&lt;/a&gt;????????&lt;a href="http://www.outletmoncler2.com/index.php?main_page=index&amp;#38;cPath=3&amp;#38;zenid=9a1f1e47f8d06d6dcbd514ba36a181a0" rel="nofollow"&gt; &lt;strong&gt;?? ?&lt;/strong&gt;&lt;/a&gt;1968???????&lt;a href="http://www.outletmoncler2.com/index.php?main_page=index&amp;#38;cPath=4&amp;#38;zenid=9a1f1e47f8d06d6dcbd514ba36a181a0" rel="nofollow"&gt; &lt;strong&gt;?? ?&lt;/strong&gt;&lt;/a&gt;???????????&lt;a href="http://www.outletmoncler2.com " rel="nofollow"&gt; &lt;strong&gt;????&lt;/strong&gt;&lt;/a&gt;?????&lt;a href="http://www.outletmoncler2.com/index.php?main_page=index&amp;#38;cPath=5&amp;#38;zenid=9a1f1e47f8d06d6dcbd514ba36a181a0" rel="nofollow"&gt; &lt;strong&gt;?? ?&lt;/strong&gt;&lt;/a&gt;??????? ?? ???????&lt;a href="http://www.outletmoncler2.com/index.php?main_page=index&amp;#38;cPath=6&amp;#38;zenid=9a1f1e47f8d06d6dcbd514ba36a181a0" rel="nofollow"&gt; &lt;strong&gt;?? ?&lt;/strong&gt;&lt;/a&gt;??????&lt;a href="http://www.outletmoncler2.com/index.php?main_page=index&amp;#38;cPath=8&amp;#38;zenid=9a1f1e47f8d06d6dcbd514ba36a181a0" rel="nofollow"&gt; &lt;strong&gt;?? ???&lt;/strong&gt;&lt;/a&gt;?????&lt;a href="http://www.outletmoncler2.com " rel="nofollow"&gt; &lt;strong&gt;??????&lt;/strong&gt;&lt;/a&gt; ?????5 ?????????TOMS ???????????&lt;a href="http://www.outletmoncler2.com " rel="nofollow"&gt; &lt;strong&gt;??????&lt;/strong&gt;&lt;/a&gt;???????????????????&lt;a href="http://www.outletmoncler2.com " rel="nofollow"&gt; &lt;strong&gt;??????&lt;/strong&gt;&lt;/a&gt;??????Supra ?????????&lt;a href="http://www.outletmoncler2.com " rel="nofollow"&gt; &lt;strong&gt;????&lt;/strong&gt;&lt;/a&gt;??????????&lt;a href="http://www.outletmoncler2.com " rel="nofollow"&gt; &lt;strong&gt;????&lt;/strong&gt;&lt;/a&gt;??&lt;/p&gt;</description>
      <pubDate>Sun, 30 Oct 2011 04:31:09 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:06c1bc63-412b-414d-a7a9-a1de4528a9c0</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-165676</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by wallyhandbags</title>
      <description>&lt;p&gt;Fashion handbags to &lt;a href="http://www.wallyhandbags.com" rel="nofollow"&gt;http://www.wallyhandbags.com&lt;/a&gt; ,free shipping any order ,ten of the speecial offer everyday!&lt;/p&gt;</description>
      <pubDate>Thu, 27 Oct 2011 13:30:27 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:afc36f46-3928-49e1-b01a-24041e25714b</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-164772</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by [url=http://www.belstaff-outlet.de/]belstaff[/url]</title>
      <description>&lt;p&gt;If you are a woman is different, Belstaff jacket, your best choice,stylish and comfortable.&lt;/p&gt;</description>
      <pubDate>Wed, 26 Oct 2011 22:14:30 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f66614e2-0335-447d-8fb8-1c229700608f</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-164128</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by [url=http://www.belstaff-outlet.de/]belstaff[/url]</title>
      <description>&lt;p&gt;If you are a woman is different, Belstaff jacket, your best choice,stylish and comfortable.&lt;/p&gt;</description>
      <pubDate>Wed, 26 Oct 2011 22:12:55 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:2e9454a0-acd1-4c9b-93a1-7d37c3e88682</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-164127</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Harry</title>
      <description>&lt;p&gt;Great post Uncle Bob! I&amp;#8217;d estimate about 99.9% of it went straight over my head, but I&amp;#8217;m sure it was useful to someone!&lt;/p&gt;</description>
      <pubDate>Fri, 21 Oct 2011 08:55:37 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:9b1cfc84-0b95-4fd4-a560-d0a8a0946f76</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-160821</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by nice cheap </title>
      <description>&lt;p&gt;Thanks for the code written by Moderator write. Useful to me.&lt;/p&gt;</description>
      <pubDate>Thu, 20 Oct 2011 06:41:26 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:8c07c07b-7b88-4c5b-87d0-4695f96faf9c</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-160180</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Edo</title>
      <description>&lt;p&gt;I agree with most of the things that Uncle Bob says, but creating a test double manually for the sake of readability is imho overkill. It may also confuse the reader, who will have to look at the test double class to see that createNameWasNotCalled() is not a member of the GSSManager class.&lt;/p&gt;</description>
      <pubDate>Tue, 18 Oct 2011 22:27:51 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:5f68bd97-d959-445b-b47a-fda485541887</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-159217</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by euro air</title>
      <description>&lt;p&gt;unique content is always best&lt;/p&gt;</description>
      <pubDate>Mon, 17 Oct 2011 10:07:21 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:4e07987e-2b8f-4ee6-b0c5-6aeb74af2b3b</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-158562</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Buy lasix 40mg</title>
      <description>&lt;p&gt;I hope most people would agree that record/playback has not shown a lot of promise for long term automation strategies. On the other hand writing good maintainable loosely coupled GUI automation code works great&lt;/p&gt;</description>
      <pubDate>Mon, 17 Oct 2011 06:50:30 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:da219bcb-cb55-406c-8823-481348dee88e</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-158515</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by Air Socks</title>
      <description>&lt;p&gt;what is a mocking framework? i&amp;#8217;m guessing it is different to a mocking bird, is it for the bird to stand on?&lt;/p&gt;</description>
      <pubDate>Fri, 14 Oct 2011 06:12:29 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:506c2d39-e814-403b-a387-08270c80dc66</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-156521</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by dsi ????</title>
      <description>&lt;p&gt;Every time I am finding this blog.Great post. Please write more and more about this.
I had never see a blog better than this one.Thank you for your post.
???????????????????&lt;/p&gt;</description>
      <pubDate>Wed, 12 Oct 2011 02:55:15 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:0a822daa-450d-49bb-810b-25201dbae9b5</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-155363</link>
    </item>
    <item>
      <title>"Mocking Mocking and Testing Outcomes." by iraq29</title>
      <description>&lt;p&gt;Parkour and Freerunning are different but not entirely. Parkour was disciplined anterior to Freerunning by David Belle. It consists of hurdles and bounds. The big philosophical system&lt;/p&gt;</description>
      <pubDate>Tue, 11 Oct 2011 06:43:56 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e4bb0557-978f-4662-96fc-805974d1ed16</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/23/mocking-mocking-and-testing-outcomes#comment-154531</link>
    </item>
  </channel>
</rss>

