2014-02-01 2 views
0

Я пытаюсь проверить загрузку Bean Singleton Startup из базы данных с использованием arquillian-persistence-impl 1.0.0.ALPHA6.Arquillian Persistence - EntityManager в Startup Bean не находит тестовые данные

Если я запускаю тестовый класс и пытаюсь получить доступ к одному из наборов тестовых данных, предоставляемых через @UsingDataSet, все работает нормально.

Вот что Arquillian класс тест выглядит

@RunWith(Arquillian.class) 
public class CountryDAOTest { 

    @Inject 
    CountryDAO dao; 

    @Produces 
    @PersistenceContext(unitName="test-pu") 
    EntityManager em; 

    @Inject 
    UserTransaction ut; 

    @Deployment 
    public static JavaArchive createDeployment() { 

     JavaArchive jar = ShrinkWrap.create(JavaArchive.class) 
        .addClass(CountryDAO.class) 
        .addClass(UserTransaction.class) 
        .addAsResource("test-persistence.xml", "META-INF/persistence.xml") 
        .addAsManifestResource("jbossas-ds.xml") 
        .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); 
       System.out.println(jar.toString(true)); 
       return jar; 
    } 

    @Test 
    @UsingDataSet("db-data/countryDAOTest-country.yml") 
    @ShouldMatchDataSet("db-data/countryDAOTest-country-verify.yml") 
    public void getCountryFromDAO(){  

     TypedQuery<Country> query = em.createQuery("FROM Country", Country.class); 
     List<Country> newCountriesList = query.getResultList(); 
     System.out.println("LOADED COUNTRIES IN TEST CLASS: "+newCountriesList.size());/*this works fine and returns 2 elements */ 

     List<Country> daoCountry = dao.getCountries(); 
     System.out.println("LOADED COUNTRIES FROM DAO: "+daoCountry.size()); /*this returns 0 elements */ 

    } 
} 

Если я пытаюсь позвонить в базу данных через мой Singleton Startup CountryDAO не находит каких-либо данных в тестовой базе данных.

@Startup 
@Singleton 
public class CountryDAO { 

    @Inject 
    private EntityManager entityManager; 
    private List<Country> countries; 

    @PostConstruct 
    public void init(){ 
     TypedQuery<Country> query = entityManager.createQuery("FROM Country", Country.class); 
     List<Country> newCountriesList = query.getResultList(); 

     System.out.println("LOADED COUNTRIES ON POSTCONSTRUCT:"+newCountriesList.size()); /* returns 0 elements */ 

     countries = Collections.unmodifiableList(newCountriesList); 
    } 

    public synchronized List<Country> getCountries(){ 
     return countries; 
    } 
} 

Я также попытался использовать аннотацию @PersistenceContext для моего dao entityManager с тем же результатом.

Я использую jboss AS 7.1.1 в качестве тестового контейнера.

Любые идеи, почему мой судовой диспетчер DAO не находит мои тестовые данные?

+0

Это потому, что тестовых данных еще нет. Данные теста вставляются при выполнении теста, а не раньше. –

+0

Большое спасибо! Вот и все. Я отправлю свое решение ниже. – Vincent

ответ

0

Благодаря комментарию Джона Амента в этом, как я установил мою проблему:

Я вновь вызывающий метод @PostConstruct аннотированного Init() мой DAO боба перед испытанием выполняется. Поэтому я добавил

@Before 
public void before(){ 
    dao.init(); 
} 

в мой CountryDAOTest Класс испытания Junit.


Проблема в деталях, что метод @PostConstruct аннотированные инициализации() вызывается, когда CountryDAO() вводится в CountryDAOTest.

Вставка моих тестовых данных происходит до вызова getCountryFromDAO(), когда CountryDAO уже введена в CountryDAOTest и уже вызван init().

Смежные вопросы