Можно ли использовать Arquillian какой-то фальшивый фреймворк, или точно, как имитировать инжектированные EJB?Я знаю, что с использованием CDI (внедрение контекстов и зависимостей) можно вводить альтернативы в тесте.Но без CDI в качестве механизма внедрения, когда я использую только EJB-инъекцию, как это возможно?
Недавно я протестировал свои EJB-компоненты с фиктивной реализацией интерфейса сервиса следующим образом:
// Service inteface
public interface Audit {
void audit(String info);
}
// Mock implementation
@Stateless
public class MockAuditBean implements Audit {
public static String lastInfo = null;
@Override
public void audit(String info) {
this.lastInfo = info;
}
}
// assert in test
assertTrue(MockAuditBean.lastInfo.contains("dummy"));
Такой подход возможен, но требует большого количества пользовательских макетов.Что еще хуже, внедренные экземпляры макетов являются прокси и используют сервисный интерфейс.Их нельзя привести к макету класса реализации для сравнения результатов.Можно использовать только статические члены и методы фиктивной реализации.
Я проверил и другие возможности для установки связанных EJB-компонентов вручную.Этот подход имеет несколько недостатков.Это требует, чтобы у целевого EJB теста были не частные члены или сеттеры для них.Когда целевой EJB полагается на аннотацию жизненного цикла @PostConstruct, вы должны вызывать ее после ручной настройки «инъекции».Преимуществом этого решения является возможность использовать фиктивные фреймворки, такие как mockito или jMock.
У кого-нибудь есть опыт, которым можно поделиться, как протестировать и настроить такой интеграционный тест, или даже использовать в нем фальшивые фреймворки?