【问题标题】:Arquillian Persistence - EntityManager in Startup Bean does not find test dataArquillian Persistence - Startup Bean 中的 EntityManager 找不到测试数据
【发布时间】:2014-02-01 11:37:47
【问题描述】:

我正在尝试使用 arquillian-persistence-impl 1.0.0.ALPHA6 测试从数据库加载国家/地区的单例启动 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 entityManager 上使用 @PersistenceContext 注释,结果相同。

我使用 jboss AS 7.1.1 作为测试容器。

任何想法为什么我的 DAO entityManager 找不到我的测试数据?

【问题讨论】:

  • 因为测试数据还不存在。执行测试时插入测试数据,而不是之前。
  • 非常感谢约翰!而已。我将在下面发布我的解决方案。

标签: java jpa junit entitymanager jboss-arquillian


【解决方案1】:

感谢 John Ament 的评论,这就是我解决问题的方法:

在执行测试之前,我正在重新调用我的 DAO bean 的 @PostConstruct 带注释的 init() 方法。所以我加了

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

到我的 CountryDAOTest Junit 测试课程。


具体问题是在CountryDAOTest中注入CountryDAO()时调用了@PostConstruct注解的init()方法。

当 CountryDAO 已经注入 CountryDAOTest 并且 init() 已经调用时,我的测试数据的插入发生在调用 getCountryFromDAO() 之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多