当前位置: 首页 > 知识库问答 >
问题:

启动Bean中的Arquillian Persistence-EntityManager找不到测试数据

柴彬
2023-03-14

我试图测试一个使用arquillian-persistence-impl1.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 */

    }
}

如果我试图通过我的单例启动程序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 AS7.1.1作为测试容器。

知道为什么我的DAO entityManager找不到我的测试数据吗?

共有1个答案

胥和悌
2023-03-14

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

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

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

到我的CountryDAOTest Junit测试类。

具体来说,问题是在CountryDaoTest中注入CountryDAO()时调用了@PostConstruct注释的init()方法。

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

 类似资料:
  • 我正在尝试在Spring应用程序中设置第二个数据源。以下是两个数据源的两个配置类: 第二个配置类: 我在com上看到过。XYXYale。坚持不懈XY a Spring数据JPA回购协议定义如下 德莫雷波 人口学 DemoRepoImpl 回购协议的使用方式如下: 我得到一个例外: 有人对如何解决这个问题有建议吗?我可以想到为每个回购注入正确的实体经理,但是我不知道如何做到这一点。 提前感谢。在这里

  • 我想在测试中使用WebTestClient。工作原理如下: 但现在我想将WebTestClient注入到一个helper类中: 下面是一个有问题的测试项目:https://github.com/kicktipp/demo 如何在Helper类上使用WebTestClient?

  • 在我的Spring Boot应用程序中,我从Thymeleaf切换到JSP,它在我的本地计算机上正常工作,但当我将它上传到Heroku服务器时,我发现出现了一个意外错误(type=notfound,status=404)/WEB-INF/jsp/home。jsp 它的罐子打包,如果它在本地工作,但不是在Heroku服务器上,这意味着什么?

  • 我有一个简单的Spring启动Web应用程序,它从数据库中读取并返回JSON响应。我有以下测试配置: 我有一个数据源 Bean,它是在应用程序的主配置中配置的。当我运行测试时,Spring 尝试加载上下文并失败,因为数据源取自 JNDI。一般来说,我想避免为此测试创建数据源,因为我有模拟的存储库。 是否可以在运行单元测试时跳过数据源的创建? 在内存中测试数据库不是一个选项,因为我的数据库创建脚本具

  • 所以我是JUnit的新手,我们必须用它来做家庭作业。我们的教授给了我们一个有一个测试类的项目。当我右键单击>Run as>JUnit Test,我会弹出一个错误,上面写着‘找不到JUnit tests’。我知道这里已经回答了这个问题(没有找到测试运行程序'JUnit4'的测试),但是关闭eclipse、重新启动、清理和构建似乎不起作用。下面是我的运行配置、构建路径和我试图测试的类的截图。

  • 如果定义在与测试类相同的包中(或在子包中),那么这就很好。 如果将其移到同级包中,则找不到该组件: org.springframework.beans.factory.NosuchBeanDefinitionException:没有“org.myproject.testutils.testHelperBean”类型的合格bean可用:应至少有一个合格的自动候选bean。依赖项注释:{@org.Sp