5 votes

Mocker une interface avec Mockito

Quelqu'un peut-il m'aider avec l'objet Mock ci-dessous ? Je veux écrire un cas de test fictif pour la classe ServiceImpl. Je veux simuler l'interface OrderIF :

public interface OrderIF{
    List<Order> ordersFor(String type);
}

La mise en œuvre du service est :

public class ServiceImpl implements Service {
    private List <Order> orders ;
    private OrderIF orderif ; // this is 3rd party interface

    public int getval(String type) {
       //some code 

       // this returns a list of objects (orders)
       orders = orderif.ordersFor(type);

       // some code 
       return orders.get(0)
    }
}

Mon code donne une NullPoinerException :

public class ServiceImplTest {
     private List <Order> ll ;
     private service reqService ; 

     @InjectMocks
     private orderIF order;

     @Before
     public void setUp() throws Exception {
         ll = new ArrayList<Order> ();
         ll.add(new Order("Buy"  ,  11 , "USD" ));
         ll.add(new Order("Sell" ,  22 , "USD" ));
         reqService = spy(new ServiceImpl());
     }

     @Test
     public void test() {
        String type= "USD" ; 
        when(order.ordersFor(type)).thenReturn(ll);
        q = reqService.getval(type);
        assertTrue(q.get().ask == 232.75);
    }
}

3voto

Jonathan Points 5620

Je suppose que order est null et vous obtenez le NullPointerException ici :

when(order.ordersFor(type)).thenReturn(ll);

Pour @InjectMocks fonctionne et instancie votre classe, vous devez ajouter un runner :

@RunWith(MockitoJUnitRunner.class)
public class ServiceImplTest {
    // ...
}

Vous n'êtes pas obligé d'utiliser le coureur, reportez-vous à la documentation pour les alternatives.

3voto

Sergii Bishyr Points 4342

@InjectMocks n'instanciera pas ou ne simulera pas votre classe. Cette annotation est utilisée pour injecter des simulacres dans ce champ.

Si vous souhaitez tester serviceImpl vous devrez vous moquer de cette manière :

@Mock
private orderIF order;

@InjectMocks
private service reqService = new serviceImpl(); 

Pour que cela fonctionne, il faut soit utiliser runner, soit MockitoAnnotations.initMocks(this); en @Before méthode.

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