dimanche 7 août 2011

Un Mockito sans glace, svp !

Le framework de mock Mockito depuis sa version 1.8.3 dispose de nouvelles annotations permettant de diminuer notre code de test.

L'annotation @InjectMocks

Posée sur un attribut, elle permet de définir l'objet qui recevra vos mocks. Un example valant mieux qu'un long discours :
@RunWith(MockitoJunitRunner.class)
public class AccountServiceTest {

  @InjectMocks
  private AccountService service = new AccountService();

  @Mock
  private AccountDao dao;

  @Test
  public void createAccountShouldCallSave() {
     Account account = new Account();

     service.createAccount(account);
     verify(dao).save(account);
  }
L'annotation @Mock permettait déjà de se passer de la création des mocks suivante :
AccountDao mockedDao = mock(AccountDao.class);


L'annotation @InjectMocks permet de se passer du code d'injection des mocks dans la classe à tester, qui dans l'exemple serait effectué par un simple setter :
service.setAccountDao(mockedDao);

ou par l'appel à l'utilitaire de réflexion de Spring :
ReflectionTestUtils.setField(service, "accountDao", mockedDao);

Pas grand chose en soi, mais avec des fois beaucoup de tests et plusieurs dépendances ça simplifie la vie et le code est plus lisible.

Helper 1 : Activation des annotations

Il existe 2 manières d'activer les annotations Mockito :

1 - Utiliser le Runner Junit (solution ci-dessus)
2 - Vous utilisez déjà un autre Runner (Spring par exemple ?), alors l'initialisation statique est faite pour vous ! Il suffit d'écrire un @Before pour initialiser le test :
@Before
public void setUpMockito() {
   MockitoAnnotations.initMocks(this);
}

Helper 2 : Instantiation automatique

Depuis la version 1.9, l'initialisation du champ annoté par @InjectMocks est inutile :
@InjectMocks
private AccountService service;

Aucun commentaire:

Enregistrer un commentaire