Какие бывают типы данных в Java
Что проверяют
Базу, без которой не написать надёжную проверку в автотесте: чем примитив отличается от ссылки, где прячутся переполнение, null и потеря точности. Следом обычно спрашивают, почему == для Integer иногда работает, а иногда нет.
Как отвечать
В Java две группы типов. Примитивов восемь:
- целые:
byte(8 бит),short(16),int(32, максимум 2 147 483 647),long(64, литерал с суффиксомL); - с плавающей точкой:
float(32) иdouble(64), двоичные, поэтому0.1 + 0.2не равно0.3; char: 16 бит без знака, одна кодовая единица UTF-16, эмодзи в одинcharне помещается;boolean:trueилиfalse, размер спецификация не фиксирует.
Ссылочные типы: классы (включая String и обёртки Integer, Long и другие), интерфейсы, массивы, enum, record (с Java 16). Переменная хранит ссылку. Поле ссылочного типа по умолчанию null, числового примитива 0, boolean false, а локальную переменную без инициализации компилятор использовать не даст. var не отдельный тип, а вывод типа при компиляции.
Автоупаковка превращает int в Integer и обратно без явного кода, и здесь начинается большая часть багов. Покажите, где это бьёт по проверкам: деньги в ответе API сравнивают через BigDecimal и compareTo, потому что equals учитывает масштаб и считает 1.0 и 1.00 разными, а граничные значения для тестов берут из реальных диапазонов типов на бэкенде.
Где спотыкаются
Сравнивают обёртки через ==. Значения от -128 до 127 берутся из кеша Integer.valueOf, и проверка проходит, а на 1000 уже сравниваются разные объекты. Нужен equals или assertEquals.
Забывают про распаковку null: поле из JSON не пришло, в DTO лежит null в Integer, присваивание в int даёт NullPointerException прямо в тесте.
Считают String примитивом или не знают, что int переполняется молча: Integer.MAX_VALUE + 1 даёт отрицательное число без исключения. Для контроля есть Math.addExact.