Mockito — InjectMocks или как получить новое значение после вызова метода

#java #testing #junit #mockito

#java #тестирование #junit #mockito

Вопрос:

У меня есть следующий класс:

 public class DaoService {
   private Dao dao;
   private Map<String, Entity> map;

   public DaoService(Dao dao, Map<String, Entity> map){
       this.dao = dao;
       this.map = map;
   }

   public create(Entity entity){
      Dao.create(entity);
      map.put(Entity.getName(), entity);
   }
}
  

Я хочу проверить, что вызов метода действительно помещает новый элемент в карту, и когда я вызываю его еще раз с другим параметром, его размер будет равен 2. Но мне нужно игнорировать Dao.create().

У меня есть следующий тестовый класс:

 @RunWith(MockitoJUnitRunner.class)
public class DaoServiceTest {
   @Mock
   Dao dao;

   @Mock
   Map<String, Entity> map = new HashMap<>();

   @InjectMocks
   DaoService service;

   @Test
   public void testCreate(){
      Entity entity = new Entity("Alex");   // name
      service.create(entity);
      assertEquals(map.size(),1);   // failNotEquals
   }
  

Как я могу сделать, чтобы при вызове service.create(entity) он игнорировал, dao.create(entity) но не игнорировал map.put(entity.getName(), entity) ?

Ответ №1:

Проблема в том, что вы комментируете map с помощью @Mock , и поэтому вы вызываете map.size() макет, а не тот, HashMap который вы назначили map . Что вы хотите здесь, так это следить за map инициализированным с помощью HashMap . Итак, вы можете просто написать

 @Spy
Map<String, Entity> map = new HashMap<>();
  

Или вы можете не использовать @InjectMocks и вводить Dao макет и обычный HashMap вручную. Таким образом, утверждение также будет работать. Игнорирование WRT dao.create(entity) , оно игнорируется дизайном Mockito, если вы не настроите его иначе