title: Major difference between: Mockito and JMockIt
body: <p>This is what I found from my initial attempts to use JMockIt. I must admit that I found the JMockIt documentation very terse for what it provides and hence I might have missed something. Nonetheless, this is what I understood:</p>
  
  <pre><code>Mockito: List a = mock(ArrayList.class) does not stub out all methods
  of List.class by default. a.add("foo") is going to do the usual thing
  of adding the element to the list.
  
  JMockIt: @Mocked ArrayList&lt;String&gt; a;
  It stubs out all the methods of a by default. So, now a.add("foo")
  is not going to work.
  
  This seems like a very big limitation to me in JMockIt.
  How do I express the fact that I only want you to give me statistics
  of add() method and not replace the function implementation itself
  What if I just want JMockIt to count the number of times method  add()
  was called, but leave the implementation of add() as is?
  
  I a unable to express this in JMockIt. However, it seems I can do this
  in Mockito using spy()
  </code></pre>
  
  <p>I really want to be proven wrong here. JMockit claims that it can do everything that
  other mocking frameworks do plus a lot more. Does not seem like the case here</p>
  
  <pre><code>@Test
  public void shouldPersistRecalculatedArticle()
  {
    Article articleOne = new Article();
    Article articleTwo = new Article();
  
    when(mockCalculator.countNumberOfRelatedArticles(articleOne)).thenReturn(1);
    when(mockCalculator.countNumberOfRelatedArticles(articleTwo)).thenReturn(12);
    when(mockDatabase.getArticlesFor("Guardian")).thenReturn(asList(articleOne, articleTwo));
  
    articleManager.updateRelatedArticlesCounters("Guardian");
  
    InOrder inOrder = inOrder(mockDatabase, mockCalculator);
    inOrder.verify(mockCalculator).countNumberOfRelatedArticles(isA(Article.class));
    inOrder.verify(mockDatabase, times(2)).save((Article) notNull());
  }
  
  
  
  @Test
  public void shouldPersistRecalculatedArticle()
  {
    final Article articleOne = new Article();
    final Article articleTwo = new Article();
  
    new Expectations() {{
       mockCalculator.countNumberOfRelatedArticles(articleOne); result = 1;
       mockCalculator.countNumberOfRelatedArticles(articleTwo); result = 12;
       mockDatabase.getArticlesFor("Guardian"); result = asList(articleOne, articleTwo);
    }};
  
    articleManager.updateRelatedArticlesCounters("Guardian");
  
    new VerificationsInOrder(2) {{
       mockCalculator.countNumberOfRelatedArticles(withInstanceOf(Article.class));
       mockDatabase.save((Article) withNotNull());
    }};
  }
  </code></pre>
  
  <p>A statement like this </p>
  
  <pre><code>inOrder.verify(mockDatabase, times(2)).save((Article) notNull());
  </code></pre>
  
  <p>in Mockito, does not have an equivalent in JMockIt as you can see from the example above</p>
  
  <pre><code>new NonStrictExpectations(Foo.class, Bar.class, zooObj)
  {
      {
          // don't call zooObj.method1() here
          // Otherwise it will get stubbed out
      }
  };
  
  
  new Verifications()
  {
      {
          zooObj.method1(); times = N;
      }
  };
  </code></pre>