Вот пример супер упрощённого тестируемого класса.
public class DishService {
DaoFactory daoFactory = DaoFactory.getInstance();
public void exampleMethod() {
System.out.println(daoFactory);
DishDao dishDao = daoFactory.createDishDao();
System.out.println(dishDao.findById(1));
}
}
Вот DaoFactory
public abstract class DaoFactory {
private static DaoFactory daoFactory;
public abstract UserDao createUserDao();
public abstract DishDao createDishDao();
public abstract OrderDao createOrderDao();
public static DaoFactory getInstance() {
if (daoFactory == null) {
synchronized (DaoFactory.class) {
daoFactory = new JDBCDaoFactory();
}
}
return daoFactory;
}
}
Вот мой тест класс
@ExtendWith(MockitoExtension.class)
class DishServiceTest {
@Spy
DishService dishService;
@Mock
DishDao dishDao;
@Mock
DaoFactory daoFactory;
@Test
void example() {
MockedStatic<DaoFactory> daoFactoryDummy = Mockito.mockStatic(DaoFactory.class);
daoFactoryDummy.when(DaoFactory::getInstance).thenReturn(daoFactory);
Mockito.when(daoFactory.createDishDao()).thenReturn(dishDao);
when(dishDao.findById(1)).thenReturn(new Dish());
dishService.exampleMethod();
}
Проблема в том, что daoFactory не мокается, как вы видите, я возвращаю пустое блюдо, а в консоли вижу это.
Это значит, что mocking не работает и я соединяюсь с реальным DishFacotry.
Dish{name='dadawd', description='wdadwad2', category=DRINKS, price=23131.00, imageFileName='FIRSTSnacksAsDaypart_1.jpg', orderItems=null}
Unnecessary stubbings detected.
1. -> at service.DishServiceTest.example(DishServiceTest.java:35)
2. -> at service.DishServiceTest.example(DishServiceTest.java:36) 35 and 36 lines of code you can see at the screen.
Вот 35 и 36 строки кода