Создать тест Mockito для класса с конструктором не по умолчанию и внедрением зависимостей - PullRequest
0 голосов
/ 04 января 2019

У меня есть класс, который использует внедрение зависимостей и имеет конструктор не по умолчанию, который инициализирует дополнительные поля.По сути, класс выглядит примерно так:

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 не будет введен.Я знаю, что это можно решить с помощью отражения, чтобы ввести поля вручную, но я бы предпочел более элегантное решение.

1 Ответ

0 голосов
/ 04 января 2019

Вы можете создать ParameterObject «вручную» в своем методе настройки следующим образом:

@BeforeEach
private void setup() {
    po = Mockito.mock(ParameterObject.class);
    given(po.getName()).willReturn("name");

    MockitoAnnotations.initMocks(this);
}

Чтобы сделать это, вам также необходимо удалить аннотацию @Mock из

@Mock
private ParameterObject po;

Теперь ваш ParameterObject создается и настраивается перед созданием любого другого макета, а затем внедряется в ваш класс с помощью конструктора не по умолчанию.

...