spock测试

AKKA是基于消息驱动和基于AKKA模型的并发工具包。 尽管AKKAScala编写, AKKA可以在任何基于JVM的语言项目中使用。 这篇文章试图填补关于在利用AKKA框架的多语言JVM项目中编写好的测试所缺少的信息的空白。 在多语言JVM项目中,我显而易见的测试工具选择是Spock 。 由GroovyJUnit提供支持,此工具使编写测试变得更加有趣。

本文不适用于AKKASpock教程。 假定读者了解GroovySpock基础知识,以及actor模型并发性的基础知识。

使用AKKA TestKit框架来测试参与者

为了我们的目的,让我们创建一个简单的actor来接收消息,在消息中添加Hello前缀,并将结果发送回原始发送者。

HelloActor.java

public class HelloActor extends UntypedActor {@Overridepublic void onReceive(Object message) throws Exception {sender().tell("Hello " + Objects.toString(message.toString()), self());}
}

即使是非Scala项目,测试AKKA演员也非常简单。 感谢Testing Actor Systems中描述的出色的TestKit框架。 可以如下所示编写简单的测试。

HelloActorTest.groovy

class HelloActorTest extends Specification {@AutoCleanup("shutdown") (1)def actorSystem = ActorSystem.create()def probe = new JavaTestKit(actorSystem) (2)def "actor should say hello"() {given:def helloActor = actorSystem.actorOf(Props.create(HelloActor))when:helloActor.tell("world", probe.ref) (3)then:probe.expectMsgEquals("Hello world") (4)}
}

(1)注释告知Spock测试结束后,要清理变量,调用提到的方法,即shutdown
(2) JavaTestKit是TestKit框架的核心,提供了与参与者交互的工具
(3)发送world字符串作为actor的消息,将JavaTestKit实例作为消息发送者传递 (4)断言probe收到了正确的消息,即以Hello

测试AKKA扩展

AKKA扩展是一种轻量级且功能强大的方式,可通过项目特定的功能扩展AKKA核心功能。 让我们通过使用任意问候代替硬编码的Hello来增强我们的系统。 为此,我们可以使用公开的单个方法来创建名为GreetExtension AKKA扩展。 调用该方法将返回预定义列表中的随机问候语

GreetExtension.java

public class GreetExtension implements Extension {public static final ExtensionKey<GreetExtension> KEY = new ExtensionKey<GreetExtension>(GreetExtension.class) {}; (1)private final Random random;private final ExtendedActorSystem actorSystem;public GreetExtension(ExtendedActorSystem actorSystem) {this.actorSystem = actorSystem;this.random = new Random();}public static final List<String> GREET_WORDS = Arrays.asList("Hello", "Nice to meet you", "What's up");public String greetWord() {return GREET_WORDS.get(random.nextInt(GREET_WORDS.size())); (2)}
}

(1)唯一标识符,允许从ActorSystem实例获取扩展
(2)随机选择任何可用的问候语

对于AKKA扩展使用的插图,让我们创建的修改版本HelloActor -命名GreetExtensionActor 。 通过使用GreetExtension生成响应,其行为将与原始行为不同。 Actor会要求问候语扩展名,在原始消息之前加上前缀,然后回复消息的发件人。

GreetExtensionActor.groovy

public class GreetExtensionActor extends UntypedActor {@Overridepublic void onReceive(Object message) throws Exception {GreetExtension greetExtension = GreetExtension.KEY.get(context().system()); (1)sender().tell(greetExtension.greetWord() + " " + Objects.toString(message), self());}
}

(1)通过其标识符获取AKKA扩展名

使用AKKA TestKit测试AKKA扩展感知演员

我们可以修改HelloActorTest.java测试套件GreetExtensionActor以这样的方式。

GreetExtensionActorTest.groovy

def "actor should greet via AKKA extension"() {given:def helloActor = actorSystem.actorOf(Props.create(GreetExtensionActor))when:helloActor.tell("world", probe.ref)then:def msg = probe.expectMsgClass(String)msg.endsWith("world") && GreetExtension.GREET_WORDS.any { msg.startsWith(it) } (1)
}

(1)由于前缀是随机生成的-我们无法检查完全匹配,而是检查响应消息是否以可能的值之一作为前缀

模拟AKKA扩展

上面测试用例的明显缺点是依赖于GreetExtension后者的行为是不确定的。 GreetExtensionActor不能单独进行测试,也不能使用一组定义的输入/输出值进行测试。 为了克服这个问题,最明显的选择是使用模拟GreetExtension模拟注入到actor系统中。 Spock本身提供了AKKA和存根功能,但是不幸的是, AKKA没有提供用存根实例代替AKKA扩展的API。 幸运的是,由于Groovy性质,可以访问ActorSystem私有成员。 使用此技巧,我们可以用存根手动替换AKKA扩展实例,并能够编写具有定义的输入/输出的测试用例。

GreetExtensionActorTest.groovy

def "actor should greet via mocked AKKA extension"() {given:def helloActor = actorSystem.actorOf(Props.create(GreetExtensionActor))and:GreetExtension.KEY.get(actorSystem)actorSystem.extensions[GreetExtension.KEY] = Stub(GreetExtension) { (1)greetWord() >> "Bye"}when:helloActor.tell("world", probe.ref)then:probe.expectMsgClass(String) == "Bye world"
}

(1) 魔术 ,访问actor系统内部,使用扩展存根调整其值

使用Groovy扩展模块扩展Actor系统功能

查看先前的测试,可以检测到这段代码,这些代码可能会在测试用例之间重复。 该代码用于用模拟代替实际的AKKA扩展。

GreetExtension.KEY.get(actorSystem)
actorSystem.extensions[GreetExtension.KEY] = Stub(GreetExtension) {greetWord() >> "Bye"
}

如果我们可以将其提取为实用程序方法,然后在需要的地方使用它,那将是很好的。 一种可能性是使用Groovy特征并将特征混合到每个Spock规范类中。 似乎不太冗长的另一个选择是能够使用可以完成此工作的新方法来增强ActorSystem 。 幸运的是, Groovy有一种使用扩展模块来做到这一点的方法。

我们可以在运行时将方法添加到仅对测试类可见的任何类,而不会影响生产代码。 要启用它,我们必须将名为org.codehaus.groovy.runtime.ExtensionModule文件放入test/resources/META-INF/services文件夹中。

org.codehaus.groovy.runtime.ExtensionModule

moduleName = akka-spock-module
moduleVersion = 1.0
extensionClasses = ua.eshepelyuk.blog.ActorSystemExtensionModule

然后,我们准备实现扩展模块功能。

ActorSystemExtensionModule.groovy

class ActorSystemExtensionModule {static <T extends Extension> void mockAkkaExtension(ActorSystem actorSystem, ExtensionId<T> extId, T mock) {extId.get(actorSystem)actorSystem.extensions[extId] = mock}
}

因此,拥有ActorSystem加强与mockAkkaExtension方法,我们终于可以重写测试情况如下。

GreetExtensionActorTest.groovy

def "actor should greet with mocked AKKA extension, using Groovy extension module"() {given:def helloActor = actorSystem.actorOf(Props.create(GreetExtensionActor))and:actorSystem.mockAkkaExtension(GreetExtension.KEY, Stub(GreetExtension) { (1)greetWord() >> "Bye cruel"})when:helloActor.tell("world", probe.ref)then:probe.expectMsgClass(String) == "Bye cruel world"
}

(1)ActorSystem实例上调用方法,该方法在Scala代码中不存在,由我们的ActorSystemExtensionModule添加

  • 完整的项目代码可在My GitHub上获得

翻译自: https://www.javacodegeeks.com/2015/11/testing-akka-application-with-spock.html

spock测试

spock测试_用Spock测试AKKA应用程序相关推荐

  1. spock测试_使用Spock测试您的代码

    spock测试 Spock是针对Java和Groovy应用程序的测试和规范框架. Spock是: 极富表现力 简化测试的"给定/何时/然后" 语法 与大多数IDE和CI服务器兼容. ...

  2. spock测试_将Spock 1.3测试迁移到Spock 2.0

    spock测试 了解Spock 2.0 M1(基于JUnit 5)的期望,如何在Gradle和Maven中迁移到它以及为什么报告发现的问题很重要:). 重要说明 . 我绝对不建议您永久将您的现实项目迁 ...

  3. 编写junit 测试_编写JUnit测试的另一种方法(Jasmine方法)

    编写junit 测试 最近,我为一个小型个人项目编写了很多Jasmine测试. 我花了一些时间才终于感到正确地完成了测试. 在此之后,当切换回JUnit测试时,我总是很难过. 由于某种原因,JUnit ...

  4. 机器学习中qa测试_机器学习项目测试怎么做?(看实例)

    机器学习交付项目通常包含两部分产物,一部分是机器学习模型,另一部分是机器学习应用系统.机器学习模型是嫁接在应用之上产生价值的.比如:一款预测雷雨天气的APP,它的雷雨预测功能就是由机器学习模型完成的. ...

  5. spock 集成测试_使用Spock Mocks进行Grails 3.3集成测试

    spock 集成测试 在Grails单元测试中,可以轻松使用Grails随附的Spock框架来模拟或存根协作者(例如服务). " 测试"一章对模拟协作者, doWithSpring ...

  6. spock 集成测试_使用Spock 1.2简化对遗留应用程序的集成测试

    spock 集成测试 了解如何利用Spock 1.2切片传统应用程序的Spring上下文,编写集成测试. 您是否曾经想过,要开始使用一些遗留应用程序,编写一些测试以了解正在发生的事情,并可能收到有关回 ...

  7. 大样品随机双盲测试_训练和测试样品生成

    大样品随机双盲测试 This post aims to explore a step-by-step approach to create a K-Nearest Neighbors Algorith ...

  8. 汽车线束测试软件,Aigtek线束测试仪,汽车线束测试_高精度自动测试_操作简单...

    高颜值的事物仿佛拥有一种魔力,让人想要靠近:而质量,则是另一种磁力超强的特性,它有着永恒的魅力.Aigtek线束测试仪在颜值与质量的道路上一路向前,用精益求精的设计以及对产品严谨的态度征服了每一位消费 ...

  9. idea使用junit测试_在JUnit测试中使用Builder模式

    idea使用junit测试 这并不是要成为技术含量很高的职位. 这篇文章的目的是为您提供一些指导,以使您的JUnit测试生活更加轻松,使您能够在几分钟内编写复杂的测试场景,并获得具有高度可读性的测试. ...

最新文章

  1. DotNet Core 2.2 MVC Razor 页面编译为 View.dll 文件的解决方法
  2. php文本文件操作,PHP文本操作类
  3. 试试博客园的markdown编辑器
  4. Excel 2007中不可不知的数字
  5. 虚拟化运维工具医院解决方案
  6. 解决 | 老司机都无法解决的事情,谁能解决?
  7. java抓取动态生成的网页
  8. python装饰器详解-如何更通俗地讲解Python的装饰器?
  9. Linux操作系统下的多线程编程详细解析----条件变量
  10. 教你几招——交换变量数值
  11. CAD图纸查看器 CADViewer V9.0
  12. 中达优控触摸屏编程视频教程_YKBuilder(中达优控触摸屏编程软件)下载 v5.0.200官方版-下载啦...
  13. ORB-SLAM2安装报错历程
  14. java xlsm_poi读取excel(xls和xlsx,xlsm)给定单元格内容
  15. 关于音响系统参数测试的主要参数之一: THD+N(总谐波失真加噪声)
  16. 自然语言处理(NLP)入门(1)——前言
  17. dnn降噪_可能是周杰伦粉丝必买好物?1MORE降噪圈铁蓝牙耳机PRO版体验
  18. 请访问豆瓣电影网站,爬取4~10部电影信息(电影名、导 演、演员、海报url链接,预报片视频链接),并结合GUI界面展现电影信息,并可以根据选择的电影名, 下载指定预告片视频到本地并显示预告片。GUI
  19. 计算机辅助海报设计,包装计算机辅助设计软件应用-Illustrator 综合实例 海报制作..pptx...
  20. 过去式加ed的发音_英语单词过去式+ed,读音变化有什么规律

热门文章

  1. 有一种附件叫做V2附件
  2. (附源码)计算机毕业设计SSM基于的服装商城系统
  3. Activity 左滑退出
  4. c语言 vc 记事本设计,c语言程序设计课程设计--记事本.doc
  5. 任天堂,让爸爸带着我们全家创业,实现梦想!
  6. VS2017调试Android出现System.IO.FileNotFoundException: Could not load file or assembly 'Mono.Posix, Ve
  7. PaddleLite——将水果分类模型部署到树莓派
  8. 全球十大最顶尖的数据中心
  9. 2021年高处安装、维护、拆除考试资料及高处安装、维护、拆除模拟考试题
  10. 同花顺2015校园招聘笔试题