Как использовать JUnit с EJB3 и JPA - PullRequest
1 голос
/ 23 января 2012

Я пытаюсь протестировать Session Beans с помощью JUnit, но не могу. Я перепробовал много методов, но все еще получаю некоторые исключения. Вот что мне нужно:

  • У меня есть несколько сессионных компонентов без сохранения состояния, которые мне нужно проверить. Каждый имеет тот же @PersistenceContext и использует EntityManager
  • С моими тестовыми примерами мне нужно проверить их методы. Например: если я добавляю пользователя с именем пользователя X, а затем пытаюсь добавить другого с тем же именем пользователя, я хочу поймать исключение.

Может ли кто-нибудь предоставить простой и короткий пример общего теста? Я уже прочитал много, но я всегда получаю ошибку (я получаю NullPointerException для EntityManager, когда я вызываю метод, подобный: sessionBean.method() (который, например, entityManager.find(...)), или я не в состоянии инициализировать Context или другой PersistenceException).

Ответы [ 4 ]

4 голосов
/ 23 января 2012
1 голос
/ 26 января 2012

Я решил создать Stateless Session Bean и ввести его Entity Manager в тестовые классы.Я публикую код на тот случай, если он кому-нибудь понадобится:

@Stateless(name = "TestProxy")
@Remote({TestProxyRemote.class})
public class TestProxy implements TestProxyRemote {

    @PersistenceContext(unitName = "mph")
    private EntityManager em;

    @Override
    public void persist(Object o) {
        em.persist(o);
    }

    @Override
    public void clear() {
        em.clear();
    }

    @Override
    public void merge(Object o) {
        em.merge(o);
    }

    @Override
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public Object find(Class classe, String key) {
        return em.find(classe, key);
    }

    @Override
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public Object find(Class classe, long key) {
        return em.find(classe, key);
    }

    @SuppressWarnings("rawtypes")
    @Override
    public List getEntityList(String query) {
        Query q = em.createQuery(query);
        return q.getResultList();
    }

}



public class MyTest {

    @BeforeClass
    public static void setUpBeforeClass() throws NamingException {
        Properties env = new Properties();
        env.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
        env.setProperty(Context.PROVIDER_URL, "localhost:1099");
        env.setProperty("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
        jndiContext = new InitialContext(env);
        try {
            proxy = (TestProxyRemote) jndiContext.lookup("TestProxy/remote");
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
}

Затем я могу использовать proxy.find() для получения нужных мне сущностей, o proxy.getEntityList() для выполнения запроса для извлечения всего экземпляра сущности.,Или я могу добавить другие методы, если я хочу.

0 голосов
/ 26 июня 2014

Я использую Игла для этого.Он хорошо работает с Mockito и EasyMock, если вы хотите издеваться над другими объектами.

Сначала я пишу файл persistencte.xml для тестов (src / test / resources / META-INF), например:

<persistence-unit name="rapPersistenceTest" transaction-type="RESOURCE_LOCAL">
    <properties>
     <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
     <property name="javax.persistence.jdbc.url" value="jdbc:h2:~/test"/>
    ...
    </properties>
</persistence-unit>

В моем Junit-Testclass я пишу:

public class DaoNeedleTest {

//here Needle will create persistenceContext for your testclass
public static DatabaseRule databaseRule = new DatabaseRule("rapPersistenceTest");

//here you can get the entityManager to manipulate data directly
private final EntityManager entityManager = databaseRule.getEntityManager();

@Rule
public NeedleRule needleRule = new NeedleRule(databaseRule);

//here you can instantiate your daoService
@ObjectUnderTest
DAOService daoService;

@Test
public void test() {
    //if your method needs a transaction here you can get it
    entityManager.getTransaction().begin();

    daoService.yourMethod();        

    entityManager.getTransaction().commit();
}

Вам также необходим файл конфигурации иглы в src / test / resources, где вы указываете, какой тип Mock-провайдера вы используете.Например, я использую Mockito:

mock.provider=de.akquinet.jbosscc.needle.mock.MockitoProvider

Вот и все.

0 голосов
/ 20 февраля 2012

Unitils обеспечивает действительно классную поддержку JPA. Unitils можно использовать с JUnit или TestNG, и в случае, если вам нужна среда для насмешек, Unitils предоставляет собственный модуль для насмешек, а также поддержку EasyMock.

    @JpaEntityManagerFactory(persistenceUnit = "testPersistenceUnit")
    @DataSet(loadStrategy = RefreshLoadStrategy.class)
    public class TimeTrackerTest extends UnitilsTestNG {

        @TestedObject
        private TimeTrackerBean cut = new TimeTrackerBean();

        @InjectInto(target="cut",property="em")
        @PersistenceContext
        private EntityManager em;

        @Test
        @DataSet("TimeTrackerTest.testAddTimeSlot.xml")
        public void yourTest() {
            ...
        }
   }

@ JpaEntityManagerFactory - используется для указания вашей единицы персистентности. Он автоматически выбирает файл persistence.xml из пути к классам вашего проекта. @DataSet - на всякий случай, если вам нужно загрузить любые тестовые данные, вы можете использовать это. @TestedObject - отмечает ваш тестируемый класс @PersistenceContext - автоматически создает ваш экземпляр EntityManager из конфигураций, сделанных в файле persistence.xml - PersistenceUnit. @InjectInto - вставляет экземпляр em в цель (cut)

Для получения дополнительной информации см. это .

Надеюсь, это поможет.

...