'Mockito, MissingMethodInvocationException when run all tests in class

Here is my test class.

@ExtendWith(MockitoExtension.class)
class DishServiceTest {
    static MockedStatic<DaoFactory> daoFactoryDummy;
    static MockedStatic<FileUtil> fileUtilDummy;

    @Mock
    DaoFactory daoFactory;
    @Mock
    DishDao dishDao;
    @Spy
    DishService dishService;

    @BeforeAll
    static void setUp() {
        fileUtilDummy = Mockito.mockStatic(FileUtil.class);
        daoFactoryDummy = Mockito.mockStatic(DaoFactory.class);

    }

    @AfterAll
    static void close() {
        daoFactoryDummy.close();
        fileUtilDummy.close();
    }

    @Test
    void deleteWithImage_id0_success() {
        daoFactoryDummy.when(ServiceManager::getInstance).thenReturn(daoFactory);
        when(daoFactory.createDishDao()).thenReturn(dishDao);
        long id = 2;
        String deleteDir = "/dish-image/2";

        dishService.deleteWithImage(id, deleteDir);
        verify(dishDao, times(1)).delete(id);
        fileUtilDummy.verify(() -> FileUtil.deleteDishFolder(deleteDir));
    }

    @Test
    void update_idSet_success() {
        daoFactoryDummy.when(ServiceManager::getInstance).thenReturn(daoFactory);
        when(daoFactory.createDishDao()).thenReturn(dishDao);
        Dish dish = new Dish(2, "testName",
                "testDescription", Category.DRINKS, BigDecimal.TEN, "/image21");
        dishService.saveOrUpdate(dish);
        verify(dishDao, times(1)).update(dish);
        verify(dishDao, times(1)).close();
    }
}

I mock static methods like this because DishService class gets dao object from DaoFactory.
Here is an example of DishService method

    public class DishService {
        public void saveOrUpdate(Dish newDish) {
            try (DishDao dishDao = DaoFactory.getInstance().createDishDao()) {
                long newDishId = newDish.getId();
                if (newDishId == 0) {
                    dishDao.save(newDish);
                } else {
                    dishDao.update(newDish);
                }
            }
    }
        }

And of DaoFactory

public class JDBCDaoFactory extends DaoFactory {
    DBManager dbManager = DBManager.getInstance();
    UserDaoMapper userDaoMapper = new UserDaoMapper();
    DishDaoMapper dishDaoMapper = new DishDaoMapper();
    OrderDaoMapper orderDaoMapper = new OrderDaoMapper();
    OrderItemDaoMapper orderItemDaoMapper = new OrderItemDaoMapper();

    @Override
    public UserDao createUserDao() {
        return new JDBCUserDao(dbManager.getConnection(),
                userDaoMapper);
    }

    @Override
    public DishDao createDishDao() {
        return new JDBCDishDao(dbManager.getConnection(), dishDaoMapper);
    }

    @Override
    public OrderDao createOrderDao() {
        return new JDBCOrderDao(dbManager.getConnection(), orderDaoMapper,
                orderItemDaoMapper);
    }
}

And here is the exception I have

org.mockito.exceptions.misusing.MissingMethodInvocationException: Also, this error might show up because:

  1. you stub either of: final/private/equals()/hashCode() methods. Those methods cannot be stubbed/verified. Mocking methods declared on non-public parent classes is not supported.
  2. inside when() you don't call method on mock but on some other object. at service.DishServiceTest.update_idSet_success(DishServiceTest.java:61) Here is the line 61 enter image description here

The strangest thing here is that tests pass when I run them seperately, but if i press run all tests in class I get the exception above.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source