Simularea unei interfețe cu Mockito (Programare, Java, Mockito)

Mike a intrebat.

Poate cineva să mă ajute cu obiectul Mock de mai jos.Vreau să scriu un caz de test mock pentru clasa ServiceImpl. Vreau să mă joc cu interfața OrderIF:

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

Implementarea serviciului este:

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)
    }
}

Codul meu dă 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);
    }
}

Comentarii

  • Și unde, în codul dvs., este generat NPE? –  > Por Ralf.
2 răspunsuri
Sergii Bishyr

@InjectMocks nu va instanția sau nu va imita clasa dvs. Această adnotare este utilizată pentru injectarea de mock-uri în acest câmp.

Dacă doriți să testați serviceImpl va trebui să faceți mock în acest mod:

@Mock
private OrderIF order;

@InjectMocks
private Service reqService = new ServiceImpl(); 

Pentru a face să funcționeze trebuie să folosiți fie runner, fie MockitoAnnotations.initMocks(this); în @Before metodă.

Jonathan

Bănuiesc că order este null și că primești NullPointerException aici:

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

Pentru @InjectMocks să funcționeze și să instanți clasa ta, va trebui să adaugi un runner:

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

Nu trebuie să folosiți runnerul, consultați documentația pentru alternative.