Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 JVM如何表示具有一个值和多个值的枚举?(违反单身规则?)_Java_Unit Testing_Enums_Singleton - Fatal编程技术网

Java JVM如何表示具有一个值和多个值的枚举?(违反单身规则?)

Java JVM如何表示具有一个值和多个值的枚举?(违反单身规则?),java,unit-testing,enums,singleton,Java,Unit Testing,Enums,Singleton,具体来说,我使用的是使用枚举的单例模型。我有一个enum单例服务(业务逻辑)调用enum单例dao。我想为我的服务编写单元测试,但我不能模仿我的枚举dao,因为它是枚举和最终的。是的,我看过关于用反思来做这件事的文章,但如果可能的话,我宁愿避免这样做 所以我的想法是,为什么不在我的枚举中添加另一个value TEST_实例呢?(这确实是核心问题。) 一开始尝试这个似乎有效,但我犹豫不决 我觉得这味道很难闻 假设部署到我的web应用程序的代码只使用实例,并且在测试中只使用了TEST_实例,那么这个

具体来说,我使用的是使用枚举的单例模型。我有一个enum单例服务(业务逻辑)调用enum单例dao。我想为我的服务编写单元测试,但我不能模仿我的枚举dao,因为它是枚举和最终的。是的,我看过关于用反思来做这件事的文章,但如果可能的话,我宁愿避免这样做

所以我的想法是,为什么不在我的枚举中添加另一个value TEST_实例呢?(这确实是核心问题。)

一开始尝试这个似乎有效,但我犹豫不决

  • 我觉得这味道很难闻
  • 假设部署到我的web应用程序的代码只使用实例,并且在测试中只使用了TEST_实例,那么这个枚举是否仍然遵循单例模型
  • 还有什么不好的地方我没有考虑吗
  • 提前多谢各位, -马特


    编辑我很想将Spring用于DI,但我不允许这样做。Legacy system和上级只是简单地说“不,还没有”。我希望它会到来,但我还不被允许,所以这是我在此期间的解决方案

    我不会费心在代码中使用枚举强制使用单例模式。相反,只需创建一个DAO接口和相应的具体实现


    在单元测试中,模拟DAO接口。在生产代码中,使用依赖项注入(DI)将具体实现填充到其他类中。大多数DI框架都允许您通过配置设置强制执行singleton属性。

    实例和测试实例都是singleton。如果你想让他们表现不同,只需给他们每个方法的不同实现。谢谢你,EJP。冒着感觉愚蠢的风险,希望我能把这归咎于深夜,我没有跟随。我不知道在一个枚举中能够有两个相同的方法签名,其中,如果在值0的实例上调用,它将使用一个实现,如果在值1的实例上调用,它将使用另一个实现。只有一个值的枚举的目的是什么?您不应该首先使您的服务和DAO成为单例。为什么不使用依赖注入?@Patashu这是一种设计选择(Joshua Bloch极力鼓吹),可以强制实施单例模式。参见有效Java中的第3项。谢谢你,Duncan。我完全同意!我编辑了我最初的问题来解释,不幸的是,我的手被束缚在了前面。我很想使用Spring,但我不能:(如果您的DAO是无状态的,那么将其设置为单实例会有什么好处?每次需要时创建一个新实例不会改变任何事情:创建短期对象的速度非常快,特别是与在DAO中执行SQL查询所需的时间相比。通过将DAO设置为简单对象,您可以在单元测试中模拟它们s、 这是使用枚举无法做到的。即使您保留此枚举设计,为DAO使用接口也会允许在测试中使用接口的模拟实现,同时在生产代码中仍然使用枚举。我不明白每次创建新实例都这么便宜。很高兴知道。为DAO使用接口并不是一件容易的事enum听起来像是一个优雅而简单的解决方案。我确实喜欢enum风格;它有一种我喜欢的简单性。非常感谢你的想法!我会接受的!
        public enum MyDao {
          INSTANCE,
          TEST_INSTANCE;
    
          public boolean methodIWouldMockIfICould()
          {
            if(this == TEST_INSTANCE) { return true; }
            ... //method code here
          }
        }