Java 模拟对象、数据库访问对象和事务范围

Java 模拟对象、数据库访问对象和事务范围,java,unit-testing,transactions,mocking,graph-databases,Java,Unit Testing,Transactions,Mocking,Graph Databases,我正在使用easy mock测试我的一些类。它们是非常简单的微服务;它们从队列(顶点id)读取消息并调用方法。此方法打开事务,访问图形数据库中的顶点,对该顶点执行某些操作,最后关闭该事务 下面是一个示例方法: public void updateLocation(String s) { ReadWriteTransaction tx = GraphHolder.readWriteTransaction(); tx.commit(() -> { User us

我正在使用easy mock测试我的一些类。它们是非常简单的微服务;它们从队列(顶点id)读取消息并调用方法。此方法打开事务,访问图形数据库中的顶点,对该顶点执行某些操作,最后关闭该事务

下面是一个示例方法:

public void updateLocation(String s) {
    ReadWriteTransaction tx = GraphHolder.readWriteTransaction();
    tx.commit(() -> {
        User user = UserFactory.getUser(s, tx);
        if (user != null) {
            Location approxLocation = getMapApi().getLocationFromPhoneNumber(user.getPhone())
            user.setLocation(approxLocation);
        }
    });
}
这依赖于一个外部API,这是应该模仿的。我正在使用EasyMock,因此设置看起来有点像这样:

public MapApi getMockedMapApi() {
    ReadWriteTransaction tx = GraphHolder.readWriteTransaction();
    return tx.commit(() -> {
        Location location = LocationFactory.createLocation(tx);
        location.setCity(CITY);
        MapApi mapApi = createMock(MapApi.class);
        expect(mapApi.getLocationFromPhoneNumber(PHONE_NUMBER)).andReturn(location);
        replay(mapApi);
        return mapApi;
    });
}
这种方法的问题是location对象存在于与user对象不同的事务作用域中。访问或更改事务范围之外的任何属性或邻接会引发异常(发生在user.setLocation(approxLocation)中)

我还尝试模拟Location类并从模拟的mapsApi返回模拟的位置。问题是,我无法将模拟位置顶点设置为与真实用户顶点的邻接-我们的graph db库(tinkerpop3)在尝试执行此操作时(同样,使用user.setLocation(approxLocation))抛出一个错误

不幸的是,改变交易处理方式是不可能的


对这个问题的最佳解决方案有什么想法吗

更新原始
updateLocation(String s)
以注入
位置
对象

这没有什么区别,位置对象只能存在于事务范围内。这将把同样的问题转移到创建位置的方法上。
location
不应该只是一个可以用
new
实例化并独立于任何事务使用的值对象吗?看起来很奇怪,它需要一个事务。不,位置是一个DAO。位置也只是一个例子,拥有一个在用户或公司DAO上运行的服务是完全有效的。