2010-05-13 16 views
10

Se la scrittura uno unit test Java con beffardo utilizzando JMock, dovremmo usareQuando dovremmo usare Mockery vs JUnit4Mockery?

Mockery context = new Mockery() 

o

Mockery context = new JUnit4Mockery() 

Qual è la differenza tra i due, e quando dovremmo usare che?

risposta

8

@Rhys Non è la JUnit4Mockery che sostituisce la necessità di chiamare assertIsSatisfied, il suo JMock.class (combinato con il @RunWith). Non è necessario chiamare assertIsSatisfied quando si crea un regolare Mockery.

Il JUnit4Mockery traduce gli errori.

Per impostazione predefinita, le eccezioni di aspettativa sono riportati in Junit come ExpectationError, quindi, ad esempio, utilizzando

Mockery context = new Mockery(); 

si otterrà

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? 

e l'utilizzo,

Mockery context = new JUnit4Mockery(); 

voi otterrò

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 ha convertito l'ExpectationError in un oggetto java.lang.AssertionError che JUnit gestisce. Il risultato netto è che verrà visualizzato nel report JUnit come errore (utilizzando JUnit4Mockery) anziché un errore.

1

Quando si utilizza JMock con JUnit 4, è possibile evitare alcuni codici di avvio sfruttando il runner di prova JMock. Quando si esegue questa operazione, è necessario utilizzare JUnit4Mockery anziché il normale Mockery.

Ecco come ci si strutturare un test JUnit 4:

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

} 

Il vantaggio principale è che non c'è bisogno di chiamare assertIsSatisfied in ciascuna prova, si chiama automaticamente dopo ogni prova.

+0

Penso che era la mia confusione troppo. – time4tea

0

Meglio ancora, per http://incubator.apache.org/isis/core/testsupport/apidocs/org/jmock/integration/junit4/JUnitRuleMockery.html uso @Rule ed evitare @RunWith che potrebbe essere necessario per qualche altro sistema:

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(); 
    } 
} 
Problemi correlati