У меня есть проект с CDI, и я хотел бы создать модульный тест с помощью mocks. Чтобы управлять макетами, я хотел бы использовать EasyMock и работать с CDI, я нахожу проект cdi-unit, который кажется простым в использовании.единичный тест с CDI-модулем и EasyMock
У меня проблема, связанная с EasyMock в контексте CDI. Вот мой блок тест:
@RunWith(CdiRunner.class)
@AdditionalClasses(MockFactory.class)
public class ResultYearMServiceImplTest {
@Inject
private IStockDao stockDao;
@Inject
private ResultYearMServiceImpl resultYearMService;
@Test
public void getResultList() {
EasyMock.reset(stockDao);
EasyMock.expect(stockDao.getListStocks()).andReturn(null).once()
.andReturn(new ArrayList<DtoStock>()).once();
EasyMock.replay(stockDao);
}
}
IStockDao должен быть макет в тесте, так, чтобы получить его, я хотел бы использовать метод @Produces как это (в MockFactory-классе в КДИ единицу по @AdditionalClasses):
@Produces
@ApplicationScoped
public IStockDao getStockDao() {
return EasyMock.createMock(IStockDao.class);
}
Когда я запускаю мое модульное тестирование, макет хорошо в тестовом модуле, но я получаю эту ошибку:
java.lang.IllegalArgumentException: Not a mock: org.jboss.weld.proxies.IStockDao$-1971870620$Proxy$_$$_WeldClientProxy
Это один приходит, потому что CDI не дает экземпляр EasyMock IStockDao, но прокси-серверы tance и EasyMock не принимают это в этих методах (например, метод сброса).
Так я заменяю @ApplicationScoped в MockFactory по @Dependent, не проксифицированный экземпляра, но у меня есть новая проблема:
Это аннотация дать новый экземпляр издеваться в каждой точке впрыска, так что я могу использовать его, потому что У меня есть макет в модульном тесте для издевательства метода, вызванного в тестируемом классе. И этот пример макета должен быть таким же в тестируемом классе (это не относится к @Dependent).
Как я могу получить один и тот же экземпляр в модульном тесте и тестированном классе?
Спасибо.
Почему бы вам просто не создать свой макет в тесте и создать объект для тестирования с помощью 'new ResultYearMServiceImpl (StockDao)'? Это и есть цель инъекции зависимостей: возможность вручную вводить макетные зависимости в модульных тестах. Вам не нужен CDI для тестирования класса. –
Я не использую CDI для модульного теста, я использую CDI для всего проекта. ResultYearMServiceImpl сам вводит CDI во многих классах при запуске приложения. Поэтому мне нужно сохранить cdi для модульного теста без изменения моего конструктора для потребностей в тестировании единицы измерения. – Kiva
Вы используете инъекцию зависимостей. Поэтому введите свою зависимость. Вы можете использовать конструктор, сеттер или рефлекторные трюки для доступа к введенному полю. Если ваш издевательский фреймворк не поддерживает эти рефлексивные трюки, это не разумный выбор для использования полевой инъекции. Mockito поддерживает полевые инъекции, используя аннотации. –