Можно ли использовать какой-то фреймворк с Arquillian, или как именно имитировать внедренные EJB? Я знаю, что с использованием CDI (Contexts and Dependency Injection) можно вводить альтернативы в тест. Но без 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, вы должны вызвать ее после ручной настройки «инъекции». Это требует, чтобы целевой EJB теста имел для них не закрытые члены или сеттеры. Когда целевой EJB полагается на аннотацию жизненного цикла @PostConstruct, вы должны вызвать ее после ручной настройки «инъекции». Это требует, чтобы целевой EJB теста имел для них не закрытые члены или сеттеры. Когда целевой EJB полагается на аннотацию жизненного цикла @PostConstruct, вы должны вызвать ее после ручной настройки «инъекции». Преимуществом этого решения является возможность использовать макетные фреймворки, такие как mockito или jMock.
Есть ли у кого-нибудь опыт, которым можно поделиться, как протестировать и настроить такой интеграционный тест, или даже использовать в нем макетные фреймворки?