0

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

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

    public enum MyDao {
      INSTANCE,
      TEST_INSTANCE;

      public boolean methodIWouldMockIfICould()
      {
        if(this == TEST_INSTANCE) { return true; }
        ... //method code here
      }
    }

尝试这个似乎最初有效,但我很犹豫。

  1. 这对我来说有难闻的气味。
  2. 假设部署到我的 Web 应用程序的代码仅使用 INSTANCE 并且唯一使用 TEST_INSTANCE 的地方是在测试中,这个枚举是否仍然遵循单例模型?
  3. 这还有什么我没有考虑的不好的地方吗?

非常感谢你,-马特

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

4

1 回答 1

1

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

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

于 2013-04-19T07:02:51.257 回答