2015-11-19 4 views
1

Я пытаюсь просто перевести пример Arquillian arquillian-persistence-tutorial в тест TestNG. Я заменил соответствующие зависимости (junit:junit =>org.testng:testng, org.jboss.arquillian.junit:arquillian-junit-container =>org.jboss.arquillian.testng:arquillian-testng-container) и обновил исходный код (https://gist.github.com/thomas-mc-work/a296ac40caa402b5120a).Выполнение Arquillian с результатами TestNG в NPE

Когда я запускаю тест, я получаю два NullPointerEception: Линии 108 и 98. Оба положения отмечают первый доступ к введенному EntityManager. Кроме того, метод arquillianBeforeTest не выполняется в качестве expexted. Также не с классическим типом TestNG, например, с помощью @BeforeMethod.

+0

Есть ли какие-либо из других методов Аркиллиан, как и следовало ожидать? Вы посмотрели http://jayshaughnessy.blogspot.com/2012/11/arquillian-and-testng.html? TestNG всегда был flaky с Arquillian :( – LightGuard

+0

Теперь я пробовал очень простой пример тестового класса и считал, что методы Arquillian не вызываются. Но методы тестирования: -/Да, я видел эту ссылку, и я был немного Я использую TestNG в качестве модуля UnitTest во всех моих проектах. Я не хочу отказываться от этого общего решения только потому, что у arquillian есть некоторые (ненужные) побочные эффекты :-( –

+0

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

ответ

2

Пожалуйста, проверьте свои тесты с помощью метода inContainer(), чтобы узнать, работают ли ваши тесты на сервере/контейнере. Более подробная информация находится на http://jayshaughnessy.blogspot.com/2012/11/arquillian-and-testng.html

Решение состоит в использовании аннотаций от TestNG @BeforeMethod и @AfterMethod. Важное различие заключается в том, что TestNG вызывается дважды за каждый тест Аркиллиан: один раз внутри и один раз за пределами контейнера. Снаружи на первом месте, где EntityManager не может быть введено. Поэтому вы должны спросить, находитесь ли вы внутри или снаружи:

@ArquillianResource 
protected InitialContext initialContext; 

@PersistenceContext 
protected EntityManager em; 

protected boolean inContainer() { 
    // If the injection is done we're running in the container. 
    return (null != initialContext); 
} 

@BeforeMethod 
protected void beforeMethod() { 
    if(inContainer()) { 
     // use the EntityManager 
    } 
} 
Смежные вопросы