web-dev-qa-db-fra.com

Se moquer d'une interface avec Mockito

Quelqu'un peut-il m'aider avec l'objet Mock ci-dessous. Je veux écrire un scénario de test simulé pour la classe ServiceImpl. Je veux me moquer de 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 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);
    }
}
14
Mike

@InjectMocks N'instanciera ni ne se moquera de votre classe. Cette annotation est utilisée pour injecter des maquettes dans ce domaine.

Si vous voulez tester serviceImpl, vous devrez vous moquer de cette façon:

@Mock
private OrderIF order;

@InjectMocks
private Service reqService = new ServiceImpl(); 

Pour le faire fonctionner, vous devez utiliser runner ou MockitoAnnotations.initMocks(this); dans la méthode @Before.

7
Sergii Bishyr

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

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

Pour @InjectMocks pour travailler et instancier votre classe, vous devrez ajouter un coureur:

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

Vous n'avez pas besoin d'utiliser le runner, reportez-vous à la documentation pour les alternatives.

4
Jonathan