2

我有一些 Roo 生成的实体,带有动态查找器。

我正在尝试对一个类进行单元测试,该类基本上从数据库上的不同表中加载一些数据,运行一些计算,然后输出由这些计算结果组成的结构化对象,我想模拟持久层为了能够在没有数据库的情况下运行测试(例如在 Jenkins 上)。

但是,我找不到一个简单的解决方案来做到这一点:我尝试添加@MockStaticEntityMethods,但是由 Roo 创建的查找器的静态方法返回TypedQuery而不是实际实体,所以我无法将模拟对象传递给AnnotationDrivenStaticEntityMockingControl.expectReturn.

我也尝试过使用 Mockito 和 Powermock,但我似乎仍然无法克服静态查找器方法返回TypedQuery而不是真实实体的问题。

那么,嘲笑 Roo 生成的查找器的标准方法是什么?

4

2 回答 2

1

您是否尝试过创建 TypedQuery 的模拟并将其设置为返回模拟。

此外,这不是您问题的答案,但您是否考虑过使用 HSQL 之类的东西进行集成测试?

于 2012-09-28T16:42:44.797 回答
0

最后,我通过创建一个 TypedQuery 的子类来解决这个问题,如下所示:


public class DummyTypedQuery implements TypedQuery
    private T singleResult;
    private List resultList;

    public DummyTypedQuery(T singleResult) {
        this.singleResult = singleResult;
    }

    public DummyTypedQuery(List resultList) {
        this.resultList = resultList;
    }

    public DummyTypedQuery() {

    }

    @Override
    public List getResultList() {
        return resultList;
    }

    @Override
    public Object getSingleResult() {
        return singleResult;
    }
        ...the rest of implemented methods, left blank

并将其设置为通过 AnnotationDrivenStaticEntityMockingControl 由 Roo 查找器返回;DummyTypedQuery 返回以编程方式创建的模拟对象,因此我不需要在数据库中有测试数据(也不需要实际连接到数据库)来运行测试。

我希望找到一些更优雅的方法来做到这一点,但这看起来是唯一的方法。

于 2012-10-03T09:46:52.443 回答