Mocking a List and attempting to iterate over it

后端 未结 3 944
一生所求
一生所求 2021-01-21 02:25

Currently using Mockito to Test a method from one of my classes. My class contains a List, and the method takes in an object of the same class. The issue is when I attempt to it

3条回答
  •  有刺的猬
    2021-01-21 02:53

    As @Adam says: "Iterating over a list using for-each syntax calls Collection.iterator() under the hood. This returns null because you've not setup mockito to return anything else." So you have to setup mockito in this way;

        @Test
    public void test_mergeShipments_increasesByOneWhenAShipmentOfOneAddedToAShipmentORderSizeOfTwo(){
    
          //GIVEN
    
       //Mock the iterator
        Iterator stockIteratorMock = mock(Iterator.class);
    
        //WHEN
    
        //In setUp method you put two objs
        when(mockShipmentOrder.size()).thenReturn(2); 
    
       //Set a mock for iterator
        when(mockShipmentOrder.iterator()).thenReturn(iteratorMock);
    
       // Instruct the iteratorMock when stop to return item
        when(iteratorMock.hasNext())
                .thenReturn(true)
                .thenReturn(true)
                .thenReturn(false);
    
        // Instruct the iteratorMock what obj return on each call
        // You can skip this: mockShipmentOrders.add(mockOrder1);
        when(stockIteratorMock.next())
          .thenReturn(mockOrder1)
          .thenReturn(mockOrder2);
    
        shipment.mergeShipments(shipment);
    
        //THEN
        assertEquals(2, shipment.getShipmentOrders().size());
    }
    

    This way is verbose, but you are free to modify the behaviour of the array list and also understand how it works under the wood.

提交回复
热议问题