Что лучшим способом является к модульному тесту компонент EJB3, не имея необходимость развертывать компонент

Ниже приведен итеративный подход (в отличие от рекурсивного решения), который вы можете использовать для достижения своего результата. По сути, начните с поиска корневого элемента, а затем переберите исходный массив, ища элементы, у которых текущий элемент является родительским.

Чтобы добиться замены родительской электронной почты идентификатором, просто сохраните карту родительских имен с идентификаторами:

var data = [{
  "id": 1,
  "email": "a@b.com", // unique
  "parent": "c@b.com" // is nullable
}, {
  "id": 2,
  "email": "b@b.com",
  "parent": null
}, {
  "id": 3,
  "email": "c@b.com",
  "parent": "b@b.com"
}, {
  "id": 4,
  "email": "d@b.com",
  "parent": "a@b.com"
}]

//Map email addresses to IDs
var map = data.reduce((accum, el) => {
  accum[el.email] = {
    id: el.id
  }
  return accum;
}, {});


var [root] = data.filter(el => !el.parent);
var users = [root];
var cur;
var children;
while (users.length < data.length) {
  cur = users[users.length - 1];
  //Find elments that have cur as parent
  children = data.filter(el => el.parent === cur.email);
  children.forEach(el => {
    users.push({
      id: el.id,
      email: el.email,
      parent: map[el.parent].id
    });
  });
}

console.log(users)

13
задан Rich Seller 30 July 2009 в 19:20
поделиться

2 ответа

Не обязательно самый легкий путь, но мне удалось получить эту работу с помощью встраиваемого контейнера JBOSS EJB3.0, с главной помощью со стороны Персистентности Java с В спящем режиме

Для запуска я не знаю о плагинах/зависимостях знатока для этого, таким образом, я должен был установить свое собственное локально:

(1) Загрузить jboss-EJB-3.0_Embeddable_ALPHA_9.zip от загрузок

(2) Этот zipfile содержит две важных БАНКИ:

  • jboss-ejb3-all.jar
  • thirdparty-all.jar

(3) Установите эти БАНКИ в свой локальный репозиторий (используйте свои собственные инициалы вместо nkl):

mvn install:install-file \
    -Dfile=jboss-ejb3-all.jar \
    -DgroupId=nkl.jboss.embedded \
    -DartifactId=jboss-ejb3-all \
    -Dversion=3.0-alpha-9

mvn install:install-file \
    -Dfile=thirdparty-all.jar \
    -DgroupId=nkl.jboss.embedded \
    -DartifactId=thirdparty-all \
    -Dversion=3.0-alpha-9

(4) Если все подходило, у Вас должно теперь быть два каталога в Вашем локальном репозитории.

(5) Теперь добавьте следующие зависимости к Вашему pom.xml

    <dependency>
      <groupId>nkl.jboss.embedded</groupId>
      <artifactId>jboss-ejb3-all</artifactId>
      <version>3.0-alpha-9</version>
    </dependency>
    <dependency>
      <groupId>nkl.jboss.embedded</groupId>
      <artifactId>thirdparty-all</artifactId>
      <version>3.0-alpha-9</version>
    </dependency>

(6) Я также должен был добавить зависимости для HSQLDB и SLF4J

(7) Необходимо скопировать некоторые файлы с conf каталог zipfile к src/main/resources каталог Вашего проекта:

  • default.persistence.properties
  • ejb3-interceptors-aop.xml
  • embedded-jboss-beans.xml
  • jndi.properties

(8) Я создал свое собственное beans.xml и persistence.xml файлы в src/main/resources/META-INF:

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd" xmlns="urn:jboss:bean-deployer">
  <bean name="messageDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource">
    <property name="jndiName">java:/messageDS</property>
    <property name="driverClass">org.hsqldb.jdbcDriver
    </property>
    <property name="connectionURL">jdbc:hsqldb:test</property>
    <property name="minSize">0</property>
    <property name="maxSize">10</property>
    <property name="blockingTimeout">1000</property>
    <property name="idleTimeout">30000</property>
    <property name="transactionManager">
      <inject bean="TransactionManager" />
    </property>
    <property name="cachedConnectionManager">
      <inject bean="CachedConnectionManager" />
    </property>
    <property name="initialContextProperties">
      <inject bean="InitialContextProperties" />
    </property>
  </bean>
  <bean name="messageDS" class="java.lang.Object">
    <constructor factoryMethod="getDatasource">
      <factory bean="messageDSBootstrap" />
    </constructor>
  </bean>
</deployment>

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
  http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
  version="1.0">
  <persistence-unit name="jpa">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:/messageDS</jta-data-source>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
      <property name="hibernate.show_sql" value="true" />
      <property name="hibernate.format_sql" value="true" />
      <property name="hibernate.hbm2ddl.auto" value="create" />
    </properties>
  </persistence-unit>
</persistence>

(9) Я создал модульный тест как следующая, использующая дополнительная информация отсюда.

package org.nkl;

import java.io.File;

import javax.naming.InitialContext;

import org.jboss.ejb3.embedded.EJB3StandaloneBootstrap;
import org.jboss.ejb3.embedded.EJB3StandaloneDeployer;
import org.junit.Test;
import org.nkl.model.MessageHandler;

public class BasicTest {

    @Test
    public void testEjb() throws Exception {
        EJB3StandaloneBootstrap.boot(null);
        EJB3StandaloneBootstrap.deployXmlResource("META-INF/beans.xml");
        EJB3StandaloneDeployer deployer = EJB3StandaloneBootstrap
                .createDeployer();

        deployer.getArchives().add(new File("target/classes").toURI().toURL());

        deployer.create();
        deployer.start();
        InitialContext context = new InitialContext();
        MessageHandler messageHandler = (MessageHandler) context
                .lookup("MessageHandlerBean/local");
        messageHandler.saveMessages();
        messageHandler.showMessages();
        EJB3StandaloneBootstrap.shutdown();
    }
}

(10) Это использует простой SLSB как:

package org.nkl.ejb;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.nkl.model.Message;
import org.nkl.model.MessageHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Stateless
public class MessageHandlerBean implements MessageHandler {

    @PersistenceContext
    private EntityManager em;

    Logger logger = LoggerFactory.getLogger(MessageHandlerBean.class);

    public void saveMessages() {
        logger.info("In saveMessages");
        em.persist(new Message("Hello World"));
    }

    @SuppressWarnings("unchecked")
    public void showMessages() {
        logger.info("In showMessages");
        List messages = em.createQuery(
                "select m from Message m order by m.text asc").getResultList();
        for (Object o : messages) {
            logger.info(((Message) o).getText());
        }
    }
}

(11) И класс объекта сообщения как:

package org.nkl.model;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "MESSAGES")
public class Message {
    @Id
    @GeneratedValue
    @Column(name = "MESSAGE_ID")
    private Long id;
    @Column(name = "MESSAGE_TEXT")
    private String text;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "NEXT_MESSAGE")
    private Message nextMessage;

    public Message(String text) {
        this.text = text;
    }

    Message() {}

    // setters/getters not shown.

}

Позволяет просто говорят, что существует много камней преткновения по пути в этом подходе.

Особенно сделать с порядком зависимостей.

Удачи!!

12
ответ дан 2 December 2019 в 00:04
поделиться

Я должен предупредить, что встроенный JBoss является путаницей. Вы не должны верить моему слову. Посмотрите форумы для себя. Это - альфа всеми возможными средствами. Вещи могут работать на Вас теперь, но кто знает, какие ошибки все еще ожидают там... Предположение, что проект будет жить в течение долгого времени.. это - риск.

Можно попробовать OpenEJB. Это ограничено в некоторых аспектах (с точки зрения гибкости), но это действительно просто в использовании и полное совместимый со спецификацией. Существует несколько ссылок, таких как это и это. Загрузите его и дайте ему попытку. Между прочим, OpenEJB привлек мое внимание путем чтения JBoss Встроенные сообщения Форума... от сердитых пользователей, указывающих на альтернативы.

Лично, я решил создать для своих проектов своего рода ложный контейнер, который позволяет мне тестировать почти что-либо, в чем я нуждаюсь. Для персистентности я использую, в спящем режиме менеджер по Объекту + HSQL. Мне потребовалась неделя для реализации, но мои команды (2 до сих пор) очень довольны им. Я сделаю это открытым исходным кодом, если это возможно.

Последняя опция является ejb3unit.

4
ответ дан 2 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: