Когда мы должны использовать Mockery против JUnit4Mockery? - PullRequest
11 голосов
/ 13 мая 2010

Если при написании модульного теста Java с использованием макетов используется JMock, следует ли использовать

Mockery context = new Mockery()

или

Mockery context = new JUnit4Mockery()

В чем разница между ними, и когда мы должны их использовать?

Ответы [ 3 ]

9 голосов
/ 07 июня 2010

@ Рис Это не JUnit4Mockery, который заменяет необходимость вызова assertIsSatisfied, это JMock.class (в сочетании с @RunWith). Вам не нужно звонить assertIsSatisfied, когда вы создаете обычный Mockery.

JUnit4Mockery переводит ошибки.

По умолчанию ожидаемые исключения сообщаются в Junit как ExpectationError, например, с использованием

Mockery context = new Mockery();

вы получите

unexpected invocation: bar.bar()
no expectations specified: did you...
 - forget to start an expectation with a cardinality clause?
 - call a mocked method to specify the parameter of an expectation?

и использование,

Mockery context = new JUnit4Mockery();

вы получите

java.lang.AssertionError: unexpected invocation: bar.bar()
no expectations specified: did you...
 - forget to start an expectation with a cardinality clause?
 - call a mocked method to specify the parameter of an expectation?
what happened before this: nothing!

JUnit4Mockery преобразовал ExpectationError в java.lang.AssertionError, с которой имеет дело JUnit. В результате он будет отображаться в отчете JUnit как сбой (с использованием JUnit4Mockery), а не как ошибка .

1 голос
/ 17 мая 2010

При использовании JMock с JUnit 4 вы можете избежать некоторого шаблонного кода, воспользовавшись преимуществом JMock. Когда вы делаете это, вы должны использовать JUnit4Mockery вместо обычного Mockery.

Вот как вы должны структурировать тест JUnit 4:

@RunWith(JMock.class)
public void SomeTest() {
  Mockery context = new JUnit4Mockery();

}

Основное преимущество в том, что нет необходимости вызывать assertIsSatisfied в каждом тесте, он вызывается автоматически после каждого теста.

0 голосов
/ 19 апреля 2012

Еще лучше, за http://incubator.apache.org/isis/core/testsupport/apidocs/org/jmock/integration/junit4/JUnitRuleMockery.html используйте @Rule и избегайте @RunWith, который вам может понадобиться для какой-то другой системы:

public class ATestWithSatisfiedExpectations {
     @Rule
     public final JUnitRuleMockery context = new JUnitRuleMockery();
     private final Runnable runnable = context.mock(Runnable.class);

     @Test
     public void doesSatisfyExpectations() {
         context.checking(new Expectations() {
             {
                 oneOf(runnable).run();
             }
         });

         runnable.run();
     }
 }
...