174 votes

Initialisation des objets fantaisie - MockIto

Il y a plusieurs façons d'initialiser un objet fantaisie en utilisant MockIto. Quel est le meilleur moyen parmi ceux-ci ?

1.

 public class SampleBaseTestCase {

   @Before public void initMocks() {
       MockitoAnnotations.initMocks(this);
   }

@RunWith(MockitoJUnitRunner.class)

mock(XXX.class);

Suggérez-moi s'il y a d'autres moyens meilleurs que ceux-ci...

11voto

emd Points 716

Il existe un moyen efficace de le faire.

  • Si c'est un test d'unité, vous pouvez le faire :

    @RunWith(MockitoJUnitRunner.class)
    public class MyUnitTest {
    
        @Mock
        private MyFirstMock myFirstMock;
    
        @Mock
        private MySecondMock mySecondMock;
    
        @Spy
        private MySpiedClass mySpiedClass = new MySpiedClass();
    
        // It's gonna inject the 2 mocks and the spied object per reflection to this object
        // The java doc of @InjectMocks explains it really well how and when it does the injection
        @InjectMocks
        private MyClassToTest myClassToTest;
    
        @Test
        public void testSomething() {
        }
    }
  • EDIT : Si c'est un test d'intégration, vous pouvez faire ceci (pas destiné à être utilisé de cette façon avec Spring. Il s'agit juste de montrer que vous pouvez initialiser des mocks avec différents runners) :

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("aplicationContext.xml")
    public class MyIntegrationTest {
    
        @Mock
        private MyFirstMock myFirstMock;
    
        @Mock
        private MySecondMock mySecondMock;
    
        @Spy
        private MySpiedClass mySpiedClass = new MySpiedClass();
    
        // It's gonna inject the 2 mocks and the spied object per reflection to this object
        // The java doc of @InjectMocks explains it really well how and when it does the injection
        @InjectMocks
        private MyClassToTest myClassToTest;
    
        @Before
        public void setUp() throws Exception {
              MockitoAnnotations.initMocks(this);
        }
    
        @Test
        public void testSomething() {
        }
    }

7voto

Dans la dernière version de Mockito la méthode MockitoAnnotations.initMocks est déprécié

La méthode préférée est l'utilisation

Si vous ne pouvez pas utiliser de runner/extension dédié, vous pouvez utiliser MockitoSession

2voto

neXus Points 418

Les autres réponses sont excellentes et contiennent plus de détails si vous en avez envie/besoin.
En plus de ces éléments, je voudrais ajouter un TL;DR :

  1. Préférez utiliser
    • @RunWith(MockitoJUnitRunner.class)
  2. Si vous ne pouvez pas (parce que vous utilisez déjà un autre coureur), préférez utiliser
    • @Rule public MockitoRule rule = MockitoJUnit.rule();
  3. Similaire à (2), mais vous devez pas ne plus l'utiliser :
    • @Before public void initMocks() { MockitoAnnotations.initMocks(this); }
  4. Si vous voulez utiliser un objet fantaisie dans un seul des tests et que vous ne voulez pas l'exposer aux autres tests de la même classe de test, utilisez la fonction
    • X x = mock(X.class)

(1) et (2) et (3) s'excluent mutuellement.
(4) peut être utilisé en combinaison avec les autres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X