gpt4 book ai didi

unit-testing - 单元测试 EJB 3.1

转载 作者:行者123 更新时间:2023-12-04 09:27:48 25 4
gpt4 key购买 nike

我正在对 EJB 3.1 的单元测试进行小型研究。最后,我的目标是为单元测试 EJB 3.1 生成一个易于使用的解决方案。

  • 我对大型 EJB 实现的了解不多,因此我想先找一些有经验的人(你)来集中你的想法,了解单元测试 EJB 中的难点。
  • 通过我已经完成的初步研究,我可以理解使用模拟框架进行单元测试而不是使用嵌入式容器的优势。尽管两者都很好,但在单元测试方面,模拟框架略胜一筹。嵌入式容器当然很好,各有优势,但可能是单元测试的不同阶段。我仍然认为至少在使用此类框架的某些场景中应该存在一些可以改进的不足。

  • 我希望我能为单元测试 EJB 制定一个完整的解决方案,一旦完成,我可以在这个论坛上分享。

    谢谢您的支持。

    最佳答案

    我对您的建议是不要陷入我所看到的常见陷阱,即认为您需要在模拟和使用嵌入式 EJB 容器之间做出选择。
    您可以同时使用两者,也应该同时使用两者,并且在发现难以同时使用的地方,您应该要求 EJB 容器提供更好的支持和更多功能。
    当然,您会发现 OpenEJB 的人们真的很支持,并且非常乐意添加功能以支持两全其美。几乎所有真正好的功能都是围绕着用户尝试做非常具体的事情并发现它很难的请求而创建的。
    标准 EJB 容器 API

    package org.superbiz.stateless.basic;

    import junit.framework.TestCase;

    import javax.ejb.embeddable.EJBContainer;

    public class CalculatorTest extends TestCase {

    private CalculatorBean calculator;

    /**
    * Bootstrap the Embedded EJB Container
    *
    * @throws Exception
    */
    protected void setUp() throws Exception {

    EJBContainer ejbContainer = EJBContainer.createEJBContainer();

    Object object = ejbContainer.getContext().lookup("java:global/simple-stateless/CalculatorBean");

    assertTrue(object instanceof CalculatorBean);

    calculator = (CalculatorBean) object;
    }
    全源 here
    这将扫描类路径并加载所有 bean。
    无扫描,更简单的模拟方法
    在代码中定义所有内容的方法略有不同。显然,模拟更容易,因为您可以随意提供 bean 的模拟实现。
    @RunWith(ApplicationComposer.class)
    public class MoviesTest extends TestCase {

    @EJB
    private Movies movies;

    @Resource
    private UserTransaction userTransaction;

    @PersistenceContext
    private EntityManager entityManager;

    @Module
    public PersistenceUnit persistence() {
    PersistenceUnit unit = new PersistenceUnit("movie-unit");
    unit.setJtaDataSource("movieDatabase");
    unit.setNonJtaDataSource("movieDatabaseUnmanaged");
    unit.getClazz().add(Movie.class.getName());
    unit.setProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
    return unit;
    }

    @Module
    public EjbJar beans() {
    EjbJar ejbJar = new EjbJar("movie-beans");
    ejbJar.addEnterpriseBean(new StatefulBean(MoviesImpl.class));
    return ejbJar;
    }

    @Configuration
    public Properties config() throws Exception {
    Properties p = new Properties();
    p.put("movieDatabase", "new://Resource?type=DataSource");
    p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
    p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");
    return p;
    }

    @Test
    public void test() throws Exception {

    userTransaction.begin();

    try {
    entityManager.persist(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992));
    entityManager.persist(new Movie("Joel Coen", "Fargo", 1996));
    entityManager.persist(new Movie("Joel Coen", "The Big Lebowski", 1998));

    List<Movie> list = movies.getMovies();
    assertEquals("List.size()", 3, list.size());

    for (Movie movie : list) {
    movies.deleteMovie(movie);
    }

    assertEquals("Movies.getMovies()", 0, movies.getMovies().size());

    } finally {
    userTransaction.commit();
    }
    }
    }
    Full source here
    最终结果
    关注不同类型测试之间的差异等是很诱人的,但对于务实的中间人来说肯定有话要说。我个人认为能够尽可能流畅地混合“单元”和“集成”样式没有任何问题。
    当然,这是一个令人钦佩的目标。非常欢迎让我们更接近的想法和功能请求。

    关于unit-testing - 单元测试 EJB 3.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7765698/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com