春天顶部

通过参考,使用Spring 5和Spring Boot 2开始学习春天课程:

>>学习春天

目录

1.概述

有很多方法测试服务层申请。本文的目标是展示单位在隔离中测试此图层的一种方式,通过完全嘲笑与数据库的交互。

这个例子将使用春天对于依赖注入,JUnit,哈克斯特Mockito.用于测试,但技术可能会有所不同。

2.层

典型的Java Web应用程序将在DAL / DAO层顶部的服务层又将调用原始持久层。

1.1。服务层

@service公共类fooservice实现ifooservice {@autowired的ifoodao dao;@override公共长期创建(Foo实体){返回它.Dao.Create(实体);}}

1.2。DAL / DAO层

@Repository Public类Foodao Expects HibernatedAoSupport实施Ifoodao {公共长期创建(Foo实体){preconditions.checknotnull(实体);返回(long)this.gethibernateTemplate()。保存(实​​体);}}

3.动机和模糊单元测试的线路

当单元测试服务时,标准单元通常是服务班级, 就那么简单。测试将嘲笑下面的图层 - 在这种情况下,DAO / DAL层并验证其上的交互。对DAO层完全相同 - 用数据库嘲笑互动(hibernateTemplate.在此示例中)并验证与此相互作用。

这是一种有效的方法,但它导致脆性测试 - 添加或删除一层几乎总是意味着完全重写测试。这发生了,因为测试依赖于层的确切结构,以及对其的改变意味着对测试的变化。

为避免这种不灵活性,我们可以通过改变单位的定义来发展单位测试的范围 - 我们可以从服务层通过DAO的服务层来看持续运行,并一直到原始的一天持久性 - 无论如何。现在,单位测试将消耗服务层的API,并将有原始持久性嘲笑 - 在这种情况下,hibernateTemplate.

公共类fooserviceunittest {fooservice实例;私人HibernateTemplate HibernateTemplatemock;@Before public void之前(){this.instance = new fooservice();这个..Instance.dao =新的福岛();这个.ibernateTemplatemock =模拟(HibernateTemplate.class);this.instance.dao.sethibernateTeMplate(this.hibernatectemplatemock);@test公共void当许多人void时,reateistriggered_thennoexception(){//何时何地.Instance.create(新foo(“testname”));@test(预期= nullpointerexception.class)public void whencreateistriggeredfornullentity_thenexception(){//何时这个.Instance.create(null);@Test公共vod当传染员rigeRigesed_thenentityiscreated(){//当foo实体= new foo(“testname”);this.instance.Create(实体); // Then ArgumentCaptor< Foo > argument = ArgumentCaptor.forClass( Foo.class ); verify( this.hibernateTemplateMock ).save( argument.capture() ); assertThat( entity, is( argument.getValue() ) ); } }

现在测试只关注单一责任 - 当创建被触发时,创建是否到达数据库?

最后一次测试使用Mockito验证语法来检查保存已在Hibernate模板上调用方法,捕获过程中的参数,以便也可以检查它。这责任通过此互动测试验证创建实体,无需检查任何状态 - 测试信任Hibernate Save Logic按预期工作。当然需要进行测试,但这是另一种责任和另一种类型的测试。

4。结论

这种技术总是导致更多的重点测试,这使得它们更具弹性和灵活性。测试现在应该失败的唯一原因是因为责任被测被打破了。

弹簧底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>课程
评论在本文上关闭!