Mockito, MissingMethodInvocationException когда запускаю все тесты в классе

Вот мой тест класс.

@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();
    }
}

У меня такие моки статических методов, потому что DishService получает dao объект из DaoFactory. Вот пример метода DishService ( класс, который я тестирую )

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

А вот 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);
    }
}

Такую ошибку я получаю

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

Самое странное, что ошибки нет, когда я запускаю тесты в классе отдельно, но когда я нажимаю run all tests in DishServiceTestна классе, то получаю ее. Т.е. все методы, кроме первого, - кидают эксепшн выше.


Ответы (0 шт):