[英]No qualifying bean of type [javax.persistence.EntityManager]
[英]Arquillian Persistence - EntityManager in Startup Bean does not find test data
我正在尝试使用arquillian-persistence-impl 1.0.0.ALPHA6从数据库测试Singleton 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;
}
}
我还尝试在dao实体管理器上使用@PersistenceContext批注,结果相同。
我正在使用jboss AS 7.1.1作为测试容器。
有什么想法为什么我的DAO实体管理器找不到我的测试数据?
感谢John Ament的评论,这就是我解决问题的方法:
在执行测试之前,我正在重新调用DAO bean的@PostConstruct注释init()方法。 所以我加了
@Before
public void before(){
dao.init();
}
参加我的CountryDAOTest Junit测试课程。
详细的问题是,当在CountryDAOTest中注入CountryDAO()时,会调用@PostConstruct注释的init()方法。
我的测试数据的插入发生在getCountryFromDAO()调用之前,即已经将CountryDAO注入了CountryDAOTest并且已经调用了init()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.