代码之家  ›  专栏  ›  技术社区  ›  Emile

在junit测试中处理swing事件

  •  1
  • Emile  · 技术社区  · 17 年前

    我已经将Java应用程序与网络通信进行了转换,以将几个“播放器”表示为播放器对象,每个对象都有自己的通信线程。应用程序有一个“团队”对象管理所有播放器对象。有几个ui组件监听玩家通过team对象传递的事件。

    在我的设计中,team对象使用invokelater激发swing线程上的所有事件,这样我的应用程序的其余部分就不需要为线程问题而烦恼。但是,我不知道如何在JUnit测试中测试团队类。

    再多一点背景。起初,我让team对象在player对象线程上触发它的事件(根本没有线程切换)。团队单元测试成功了,但是我在我的ui中遇到了许多线程问题,包括invokelaters和synchronized。然后我决定通过让团队对象在swing线程上触发事件来简化线程模型,但是现在团队单元测试失败了,因为它没有接收事件。怎么办?

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

    3 回复  |  直到 17 年前
        1
  •  4
  •   Tom Hawtin - tackline    17 年前

    当我用JUnit测试 EventQueue.invokeLater ,我已经把自己和那个邪恶的静电分离了。创建接口 invokeLater 是 isDispatchThread 方法。对于生产来说,实施应该是 EventQueue . 对于测试,使用您自己的线程(可以为每个测试设置和拆卸线程)。

    其他一些随机建议:

    • 保持图形用户界面尽可能薄。
    • 把其他的东西都穿出去,其他的东西都穿出去。
    • 怀疑任何声称是线程安全的东西。
        2
  •  2
  •   Rolf    17 年前

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

    我推荐easymock: http://www.easymock.org/

    从您的故事中可以感觉到,您的单元测试是更多的集成测试,而且非常复杂。如果是这样,试着简化和隔离。你可能读过 http://junit.sourceforge.net/doc/testinfected/testing.htm

    我希望这能有帮助。

        3
  •  2
  •   Jeffrey Fredrick    17 年前

    想到的解决办法是 在 执行线程切换和 保持原始单元测试的完整性, 但我不喜欢 在生产中引入复杂性 代码只是为了使单元测试成功。

    我不知道这里是否是这样,但我经常发现我添加的“复杂性”实际上是一个更高层次的抽象,可以改进代码。

    模拟对象背后的最初想法并不是让单元测试变得更容易,而是“接口发现”,即创建接口来表示无处不在的语言中的抽象,而不是在api级别上工作。