#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, если вы не настроите его иначе