Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JUnit测试中处理Swing事件_Java_Unit Testing_Swing_Events_Junit - Fatal编程技术网

Java 在JUnit测试中处理Swing事件

Java 在JUnit测试中处理Swing事件,java,unit-testing,swing,events,junit,Java,Unit Testing,Swing,Events,Junit,我有一个Swing java应用程序,它与几个“玩家”进行网络通信,这些玩家被表示为玩家对象,每个人都有自己的通信线程。应用程序有一个“团队”对象管理所有玩家对象。几个UI组件监听玩家通过团队对象传递的事件 在我的设计中,团队对象使用invokeLater触发Swing线程上的所有事件,这样我的应用程序的其余部分就不需要担心线程问题。但是,我不知道如何在JUnit测试中测试Team类 多一点背景知识。起初,我让团队对象在玩家对象线程上触发事件(根本没有线程切换)。团队单元测试成功了,但是我在UI

我有一个Swing java应用程序,它与几个“玩家”进行网络通信,这些玩家被表示为玩家对象,每个人都有自己的通信线程。应用程序有一个“团队”对象管理所有玩家对象。几个UI组件监听玩家通过团队对象传递的事件

在我的设计中,团队对象使用invokeLater触发Swing线程上的所有事件,这样我的应用程序的其余部分就不需要担心线程问题。但是,我不知道如何在JUnit测试中测试Team类

多一点背景知识。起初,我让团队对象在玩家对象线程上触发事件(根本没有线程切换)。团队单元测试成功了,但是我在UI中遇到了许多线程问题,调用器和同步程序到处都是。然后,我决定通过让团队对象在Swing线程上触发事件来简化线程模型,但是现在团队单元测试失败了,因为它没有收到事件。怎么办


我想到的一个解决方案是在执行线程切换的团队顶部引入一个额外的对象,并保持原始单元测试的完整性,但我不喜欢在生产代码中引入复杂性只是为了使单元测试成功的想法。

也许您可以使用easymock来隔离要测试的类,让模拟对象接收事件并检查它们是否被触发

我推荐EasyMock:

从您的故事中可以看出,您的单元测试更像是集成测试,而且非常复杂。如果是这样,试着简化和隔离。你可能读过


我希望这会有所帮助。

也许您可以使用easymock来隔离要测试的类,让模拟对象接收事件并检查它们是否被触发

我推荐EasyMock:

从您的故事中可以看出,您的单元测试更像是集成测试,而且非常复杂。如果是这样,试着简化和隔离。你可能读过


我希望这能有所帮助。

当我使用
EventQueue.invokeLater
进行JUnit测试时,我已经将自己从这个邪恶的静态环境中分离出来。使用
invokeLater
is
isDispatchThread
方法创建接口。对于生产,实现只应转发到
EventQueue
。对于测试,使用您自己的线程(可以为每个测试设置和拆卸线程)

其他一些随机建议:

  • 使GUI尽可能精简
  • 不要让其他东西穿线,也不要让其他东西穿线
  • 怀疑任何声称是线程安全的东西

当我使用
EventQueue.invokeLater
进行JUnit测试时,我已经将自己从这个邪恶的静态环境中分离出来。使用
invokeLater
is
isDispatchThread
方法创建接口。对于生产,实现只应转发到
EventQueue
。对于测试,使用您自己的线程(可以为每个测试设置和拆卸线程)

其他一些随机建议:

  • 使GUI尽可能精简
  • 不要让其他东西穿线,也不要让其他东西穿线
  • 怀疑任何声称是线程安全的东西
我想到的一个解决办法是 在顶部引入一个额外的对象 执行线程切换和 保持原始单元测试完好无损, 但我不喜欢这种想法 在生产中引入复杂性 编写代码只是为了使单元测试成功

我不知道这里的情况是否如此,但我经常发现我添加的“复杂性”实际上是一个更高级别的抽象,它改进了代码

模拟对象背后的最初想法不是让单元测试更容易,而是“接口发现”,即创建用您的通用语言表示抽象的接口,而不是在API级别工作

我想到的一个解决办法是 在顶部引入一个额外的对象 执行线程切换和 保持原始单元测试完好无损, 但我不喜欢这种想法 在生产中引入复杂性 编写代码只是为了使单元测试成功

我不知道这里的情况是否如此,但我经常发现我添加的“复杂性”实际上是一个更高级别的抽象,它改进了代码


模拟对象背后的最初想法不是为了使单元测试更容易,而是为了“接口发现”,即创建用普遍存在的语言表示抽象的接口,而不是在API级别工作。

我测试的不仅仅是一个类,这是对的。我试图实现的是验证多个流程之间的通信是否达到团队级别。这是我想要测试的对象之间的交互,我需要思考找到另一种方式。谢谢你的建议。你说得对,我不止考一门课。我试图实现的是验证多个流程之间的通信是否达到团队级别。这是我想要测试的对象之间的交互,我需要思考找到另一种方式。谢谢你的建议。我同意复杂性和功能抽象,但在这种情况下,我“只”处理线程问题,通过在UI线程上执行大多数操作可以很容易地解决这些问题,但这会使测试更加困难。谢谢你让我重新思考我的抽象概念!我同意复杂性和功能抽象,但在本例中,我“仅”处理线程问题,通过在UI线程上执行大多数操作可以非常容易地解决这些问题,但这会使测试更加困难。谢谢你让我重新思考我的抽象概念!我喜欢你的建议,尤其是第二条。你建议引入一个接口,这可能是一个不错的选择。尽管如此,我还是觉得有点不舒服,因为我不得不“只是”做一些测试。我喜欢你的建议