О чем говорит вам это исключение...
Вы не указали экземпляр при объявлении поля
Другими словами, вы не написали...
@InjectMocks
A a = new A("foobar", 123);
Это было бы вполне приемлемо и, вероятно, решит вашу проблему. Пожалуйста, помните, что макеты НЕ будут инициализированы в этот момент, так что это нормально, если вам действительно нужны примеры String
и int
, но не в том случае, если вам нужно поместить туда макеты. Другими словами, если бы у вас был конструктор, который принимал X, и вы бы написали здесь новое A(x)
, x было бы нулевым, поскольку аннотация @Mock
еще не была обработана.
поэтому я попытался построить экземпляр
Поскольку экземпляра не было (потому что вы его не предоставили), он попытался создать его, но...
Однако конструктор или блок инициализации выдали исключение: null
Итак, ваш конструктор выдает null. Похоже, что ваш someMethodCall
зависит от аргументов (скорее всего, порта), которые не равны нулю, но, поскольку они String
и int
, Mockito понятия не имеет, какие значения там использовать. Поскольку port
является примитивным типом, а Mockito не обрабатывает их конкретно, проблема, вероятно, в нем — Mockito попытается поместить туда null, что вызовет исключение.
Например, если ваш конструктор соответствует X и Y, Mockito, вероятно, попытается поместить туда макеты, но это не так. Конструктору нужны String
и int
, и для них нет макетов, поэтому Mockito может использовать только значения по умолчанию, а это null
, что является проблемой в случае port
(из-за int
).
Итак, каково решение?
1) Либо сделайте свой конструктор нулевым, позволяя указать там нулевой порт (и убедитесь, что строка ip также обрабатывается нулевым безопасным способом).
2) Используйте то, чем не пользовались:
@InjectMocks
A a = new A("foobar", 123);
В любом случае, не обязательно иметь все зависимости в конструкторе, Mockito отлично впишет их в поля напрямую. Поэтому добавление еще одного конструктора для X и Y не является реальным решением. Конечно, как правило, внедрение конструктора предпочтительнее внедрения поля, но это уже другая тема.
Что касается вашего вопроса о том, какой конструктор: документация говорит об этом...
выбирается самый большой конструктор, затем аргументы разрешаются только с помощью моков, объявленных в тесте
Редактировать: кажется, что Mockito не знает, как обрабатывать примитивные поля в конструкторах, какой позор.
person
Florian Schaetz
schedule
24.11.2017