Как протестировать EJB-компоненты в Spring Boot - openejb не может обрабатывать JAR-файлы из нескольких выпусков из-за информации о модуле - PullRequest
0 голосов
/ 04 апреля 2019

В настоящее время я обновляю одно приложение с Spring Boot 1.X до 2.X. Одним из тестов в приложении является тестирование удаленного EJB без сохранения состояния с использованием OpenEJB под @SpringBootTest. Так как поддержка SpringBeanAutowiringInterceptor была прекращена в Spring 5, я столкнулся с задачей переписать логику и протестировать ее, и здесь возникает проблема: Мы работаем на JDK 1.8 и openejb (4.7.4, который используется в тесте для инициализации jndiContext), не может обрабатывать многократные JAR-файлы, которые зависят от обновления до Spring Boot 2.X (для пример байт-приятеля и др.) OpenEJB пытается загрузить META-INF / version / 9 / module-info и завершается с ошибкой IllegalArgumentException. Я также пытаюсь переключиться с OpenEJB на EJBcontainer вместе с glassfish в качестве загрузчика, но я сталкиваюсь с другими проблемами (bean-компонент без сохранения состояния не установлен в jndContext - проверено в DEBUG), который я сейчас пытаюсь решить.

У меня такой вопрос: Есть ли какая-либо возможность заставить classloader или openejb игнорировать module-info, чтобы иметь возможность запускать его под JDK 1.8 с несколькими выпусками jar на classpath? Или есть способ использовать EJBContainer с glassfish-embedded-all, который в настоящее время не загружает EJB, но, по крайней мере, загружает контекст без ошибок? Мне нужно избежать ошибки или использовать другой способ тестирования объекта без состояния в SpringBootTest.

Примечание: я не хочу использовать Arquillian

Сводка версий:

  • JDK 1,8
  • spring-boot-starter-parent: 2.1.3.RELEASE
  • openejb-core: 4.7.4
  • Glassfish-Embedded-All: 5.1.0

Ошибка при использовании openEJB (информация о модуле, проблема с несколькими выпусками JAR):

ERROR OpenEJB [] []- FATAL ERROR: Unknown error in Assembler.  Please send the following stack trace and this message to users@tomee.apache.org :
 java.lang.IllegalArgumentException
    at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
    at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
    at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
    at org.apache.openejb.util.AnnotationFinder.readClassDef(AnnotationFinder.java:299)
    at org.apache.openejb.util.AnnotationFinder.find(AnnotationFinder.java:164)
    at org.apache.openejb.config.DeploymentLoader.checkAnnotations(DeploymentLoader.java:2008)
    at org.apache.openejb.config.DeploymentLoader.discoverModuleType(DeploymentLoader.java:1891)
    at org.apache.openejb.config.DeploymentsResolver.processUrls(DeploymentsResolver.java:389)
    at org.apache.openejb.config.DeploymentsResolver.loadFromClasspath(DeploymentsResolver.java:302)
    at org.apache.openejb.config.ConfigurationFactory.getModulesFromClassPath(ConfigurationFactory.java:664)

Ошибка при использовании Glassfish (возможно, указаны неправильные МОДУЛИ?):

ERROR embedded [] []- EJB6005:No EJB modules found

Важная часть класса испытаний:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {
    CommonTestConfiguration.class,
    DatabaseTestConfiguration.class,
    PropositionServiceConfiguration.class,
    BeanUtils.class,
    PropositionRemoteServiceImpl.class,
    PropositionRemoteService.class})
@DirtiesContext
public class PropositionRemoteServiceImplTest {

  @Autowired
  private AdminFacade adminFacade;

  private PropositionRemoteService remoteService;

  @Before
  public void setUp() throws NamingException {
    Properties props = new Properties();
    props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
    //props.put("openejb.deployments.classpath.exclude", ".*?module-info.*?");
    Context jndiContext = new InitialContext(props);
    remoteService = (PropositionRemoteService) jndiContext.lookup("PropositionRemoteServiceImplRemote");


    //    Map<String, Object> properties = new HashMap<>();
    //        properties.put(EJBContainer.MODULES, new File("target/classes"));
    //    EJBContainer ejbContainer = EJBContainer.createEJBContainer(properties);
    //    Context ctx = ejbContainer.getContext();
    //    remoteService = (PropositionRemoteService) ctx.lookup("PropositionRemoteServiceImplRemote");
}

Структура проекта (упрощенно - крупный проект, изменить нельзя):

ude> root node module - pom
    adapter> - node-module
        ejb-adapter> node module
            ejb-adapter-impl> node module containing Stateless bean used in test
    test> node module
        test-unit> node module where the Test class is defined and run

UPDATE: В настоящее время пытается использовать apache-tomee (1.7.5) вместо openejb-core sbut, но также используется asm5, и возникает такая же ошибка

1 Ответ

0 голосов
/ 05 апреля 2019

Проблема решена с помощью более новой версии openEJB -> Apache Tomee, которая использует asm6 и поддерживает JDK 1.9, даже если я использую JDK 1.8, но из-за нескольких выпусков JARS в качестве зависимостей от Spring Boot 2 эта поддержка необходима. Используемый артефакт:

    <dependency>
        <groupId>org.apache.tomee</groupId>
        <artifactId>apache-tomee</artifactId>
        <version>8.0.0-M2</version>
        <scope>test</scope>
    </dependency>
...