首页 > 其他分享 >避免在Service层写脆弱的测试

避免在Service层写脆弱的测试

时间:2023-07-20 16:04:12浏览次数:39  
标签:脆弱 Service entity instance 测试 Foo public

 

1、简述

有很多方法可以测试Service层。本文的目标是展示一种隔离的测试方式:将于数据库交互的整个逻辑都Mock掉。

示例使用了Spring作为依赖注入、JUnit、Hamcrest、Mockito。

 

2、分层

典型的Java web应用都在DAO/DAL层之上有一个服务层,DAO/DAL层负责调用原生的持久层逻辑。

 

Service层

@Service
public class FooService implements IFooService{
 
@Autowired
IFooDAO dao;
 
@Override
public Long create( Foo entity ){
return this.dao.create( entity );
}
 
}

DAO/DAL层

@Repository
 
public class FooDAO extends HibernateDaoSupport implements IFooDAO{
 
public Long create( Foo entity ){
 
Preconditions.checkNotNull( entity );
 
return (Long) this.getHibernateTemplate().save( entity );
 
}
 
}

3、单元测试的动机和关注点

当单元测试的对象是一个服务的时候,“单元”就是Service类,测试需要模拟Service其下的层,这里就是模拟DAO/DAL层,并验证与之的交互操作。

同样地,对DAO/DAL层的单元测试来说,要模拟掉数据库层(本例中就是HibernateTemplate),并验证相关交互操作。

 

这个方法是 有效的,但是这样的测试是脆弱的。增加或移除一层的话,就需要完全重写测试。因为测试依赖了层的具体结构,层的变化就意味着测试的变化。

 

为了避免这种不灵活,我们通过延展“单元”的定义从而扩展单元测试的范围。我们可以把Service层通过DAO和其他方式穿透到持久层的操作看做一个“单元”。单元测试就针对Service层的API,模拟掉原生的持久化逻辑。本例里面就是HibernateTemplate。

public class FooServiceUnitTest{
 
FooService instance;
 
private HibernateTemplate hibernateTemplateMock;
 
@Before
public void before(){
this.instance = new FooService();
this.instance.dao = new FooDAO();
this.hibernateTemplateMock = mock( HibernateTemplate.class );
this.instance.dao.setHibernateTemplate( this.hibernateTemplateMock );
}
 
@Test
public void whenCreateIsTriggered_thenNoException(){
// When
this.instance.create( new Foo( "testName" ) );
}
 
@Test( expected = NullPointerException.class )
public void whenCreateIsTriggeredForNullEntity_thenException(){
// When
this.instance.create( null );
}
 
@Test
public void whenCreateIsTriggered_thenEntityIsCreated(){
// When
Foo entity = new Foo( "testName" );
this.instance.create( entity );
 
// Then
ArgumentCaptor< Foo > argument = ArgumentCaptor.forClass( Foo.class );
verify( this.hibernateTemplateMock ).save( argument.capture() );
assertThat( entity, is( argument.getValue() ) );
}
 
}

现在测试只关注Service类的一个职责:当创建被触发,相关操作是否传递到了数据库。

例子里面用Mockito框架的验证语法来检查HiebernateTemplate的save方法是否被调用。测试信任hibernate的保存逻辑,因此创建实体的职责只需要像这样验证save方法是否被调用。

当然保存逻辑也需要被测试,但是这是其他测试的范畴。

4、结论

这种方式会产出更多具有弹性和灵活性的测试。测试失败唯一的原因就是被测试逻辑之下的职责失败了。比如HibernateTemplate的save方法。

标签:脆弱,Service,entity,instance,测试,Foo,public
From: https://blog.51cto.com/u_11326739/6787341

相关文章

  • HPC 算力测试
     #安装前配置curl168.7.10.2:8000/local.repo>/etc/yum.repos.d/kylin_aarch64.repoyuminstall-ylibatomicenvironment-modulesvimnfs-utils&>/dev/nullmkdir-p/workspacemount168.10.1.20:/workspace/workspace#加载环境变量cat>/etc/profile.d/hpc.sh<......
  • Test Parameter-批量生成测试用例
    TestParameter-批量生成测试用例_哔哩哔哩_bilibili1.背景:如果涉及多个被测目标,例如基于多个传感器输入值测试,测试环境包括Tester(测试方),ECU(被测对象),Tester发送传感器变量SensorA和SensorB,ECU反馈Force值的过程,根据不同传感器输入值测试Force反馈值,如何结合TestParameter和Tes......
  • Test Parameter-List Parameter批量执行测试
      TestParameter-ListParameter批量执行测试_哔哩哔哩_bilibili1.ListParameter可以理解为多个常量值的集合2.背景:还是一个模拟车速测试的例子,测试序列流程如下图 若被测车速范围值太多,每次重复编写费时且易错3.创建一个ListParameter1)在已创建的Paramete......
  • java正则表达式在线测试工具
    Java正则表达式在线测试工具实现流程在实现"Java正则表达式在线测试工具"的过程中,我们可以采用以下步骤:步骤描述步骤1创建GUI窗口步骤2添加正则表达式输入框和测试字符串输入框步骤3添加测试按钮,用于触发正则表达式测试步骤4对测试结果进行展示我们将......
  • service
    service控制系统服务的实用工具补充说明service命令是RedhatLinux兼容的发行版中用来控制系统服务的实用工具,它以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。语法service(选项)(参数)选项-h:显示帮助信息;--status-all:显示所服务的状态。参......
  • 测试用例设计方法都有哪些
    在测试用例设计中,常用的方法包括等价类划分法、边界值分析法、因果图法、状态转换法、路径覆盖法和决策表法等。等价类划分法(EquivalencePartitioning):将输入值划分为等价类,从每个等价类中选择一个代表性的值作为测试用例。例如,对于一个要求输入1到100之间的数字的程序,可以将输入值......
  • 聚焦于任务调度的测试平台pytestx
    设计理念聚焦于任务调度,接口自动化80%本地编写,20%交由平台管理。如果使用pytest做接口自动化,那么个人认为最好的编写工具是PyCharm,任何低代码测试平台都无法取代。当然不会代码,或者不使用pytest,那低代码测试平台,或者yaml,甚至excel写自动化用例,都是可以接受的。而在使用pytest这......
  • WEB程序的最佳测试数据
    这里有一篇Matthias写的关于转义字符文章-“Theartofescaping”,这篇文章告诉你有一些比较特殊的字符需要你去认真的处理,不然,你的网站程序轻则出错,重则被人黑了。这些物殊的字符是[<"@%'&_\?/:;,>কী€],你可以使用这个字符串到任意一个可以输入的Web程序上去做测试。下面这......
  • 有赞的深度需求功能测试
    序:在《有赞.测试团队介绍(一)》曾经提到过,我们在测试需求项目时,会把需求逐级拆解,直到最小粒度。然后,各业务线的测试小伙伴把任务领走进行细化,同时,确定一位主测分来主导复杂项目的测试工作。在面试过程中,很多小伙伴也会说,我们会根据需求所描述的功能,进行测试。那作为一位应聘者,如......
  • 【腾讯 TMQ】移动 APP 测试用例设计的关注点
    应用的启动和停止1.1首次启动是否出现欢迎界面,欢迎界面的停留时间合理,欢迎界面后是否正常进入应用;首次启动时间是否合理;该拉取的信息是否正确;桌面图标是否创建成功,功能启动快捷键创建是否成功(某些安卓手机会有在桌面创建应用内某个功能的快捷键的需求)1.2二次启动启动时间是......