У меня есть класс, который использует внедрение зависимостей и имеет конструктор не по умолчанию, который инициализирует дополнительные поля.По сути, класс выглядит примерно так:
public class NonDefaultConstructor {
private final String name;
@Inject
private SomeService service;
public NonDefaultConstructor(ParameterObject po) {
this.name = po.getName();
}
}
С этим ParameterObject
:
public class ParameterObject {
private String name;
public String getName() {
return name;
}
}
я хочу создать тест Mockito, который внедрит макет службы SomeService
имакет аргумента конструктора ParameterObject
.Эта попытка не работает, так как она пытается смоделировать поведение в полях, которые еще не инициализированы.
public NonDefaultConstructorTest {
@Mock
private SomeService service;
@Mock
private ParameterObject po;
@InjectMocks
private NonDefaultConstructor classUnderTest;
@BeforeEach
private void setup() {
given(po.getName()).willReturn("name")
MockitoAnnotations.initMocks(this);
}
}
Создание ParameterObject
в методе setup
также не работает, так как для этого потребуетсяТам же также строится NonDefaultConstructor
, и тогда SomeService
не будет введен.Я знаю, что это можно решить с помощью отражения, чтобы ввести поля вручную, но я бы предпочел более элегантное решение.