我在service层中的一个方法,调用dao层中三个方法怎么保证这三个方法事务统一

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在service层中的一个方法,调用dao层中三个方法怎么保证这三个方法事务统一相关的知识,希望对你有一定的参考价值。

我在service层中的一个方法,调用dao层中三个方法怎么保证这三个方法事务统一,就是说dao层中一个方法出异常,三个方法都不执行。

如果用了spring,直接在service层的方法上配置AOP事务
如果没用spring,可以自己控制一下,在service开启事务,三个dao的方法都执行完了再统一提交。需要注意的是,这样的话在dao中的事务不能设为自动提交
参考技术A 在service层中使用事务控制,保证这个方法执行成功,其中的Dao中的三个方法都是成功或者都是失败
可以使用spring的注解事务比较简单

在Java中测试服务层中的void方法[重复]

【中文标题】在Java中测试服务层中的void方法[重复]【英文标题】:Test a void method in service layer in Java [duplicate] 【发布时间】:2018-09-13 01:46:42 【问题描述】:

我正在尝试使用 junit 测试服务类中的 void 方法。我不确定如何测试它。

代码:

public class Service
private static final Logger LOGGER = LogManager.getLogger(Service.class);

    private final ServiceDAO serviceDAO;
    private final RtyDAO rtyDAO;

    public Service(ServiceDAO serviceDAO,
            RtyDAO rtyDAO) 
        this.serviceDAO = serviceDAO;
        this.rtyDAO = rtyDAO;
    

    public void voidMethod(JSONObject object) 
        try 
            Rty rty = serviceDAO.getSomething();
            String output = rtyDAO.persist(rty);
            if("TRUE".equalsIgnoreCase(output))
               LOGGER.info("Success"):
            else
               LOGGER.info("Failure"):
            
        

由于上述方法无效,我不确定如何测试。我正在尝试如下:

public class ServiceTest 

@InjectMocks
Service service;

@Mock 
RtyDAO RtyDAO;

@Mock
Rty rty;

@Mock
ServiceDAO serviceDAO;



@Test
public void testVoid()
   Mockito.when(serviceDAO.getSomething()).thenReturn(rty);
Mockito.when(rtyDAO.persist(rty)).thenReturn("Success");
//how to test result here if the persisting happened without any issues?
    

【问题讨论】:

【参考方案1】:

正如你所说,方法是 Void,所以很难测试。但是有办法!您可以使用 Mockito 来证明两个调用都正确完成。检查这个答案:Mockito : how to verify method was called on an object created within a method?

【讨论】:

感谢您的回复。但我很难理解验证。它有什么作用? doNothing() 和 Verify() 有什么区别 verify 方法只会验证模拟对象上的方法是否被调用。就是这样。您可以向它传递一个值来验证它是否被调用了 N 次

以上是关于我在service层中的一个方法,调用dao层中三个方法怎么保证这三个方法事务统一的主要内容,如果未能解决你的问题,请参考以下文章

道层中的多种方法

服务层和 dao 层中的事务性

调用save()方法,页面显示保存成功,但是数据库中没有值的原因

服务层和 DAO 层中的 Spring 事务

视图层中的 DTO 或域模型对象?

依赖注入的实现方式:设值注入和构造方法注入