Java 模拟枚举中的注入

Java 模拟枚举中的注入,java,dependency-injection,enums,guice,Java,Dependency Injection,Enums,Guice,对于一个框架,我试图在枚举中注入另一个类来提供一些环境信息。它似乎可以工作,但是我不知道如何在单元测试中测试它。请帮忙 枚举: 我的测试 public class BestemmingenTest extends ExtendedEasyMockSupport { private Environment environmentMock; @Before public void setUp() { environmentMock = createMock(Environment.cla

对于一个框架,我试图在枚举中注入另一个类来提供一些环境信息。它似乎可以工作,但是我不知道如何在单元测试中测试它。请帮忙

枚举:

我的测试

public class BestemmingenTest extends ExtendedEasyMockSupport {

private Environment environmentMock;

@Before
public void setUp() {
    environmentMock = createMock(Environment.class);
}

@Test
public void BestemmingBadTb5Test() throws UnknownHostException {
     expect(environmentMock.getComputerName()).andReturn("TB5");
     replayAll();

     final BestemmingBad bestemming = BestemmingBad.TEST;
     assertThat(bestemming.getUrl(), is("jms@testserver@jms1/test"));
}

private class TestModule extends TestGuiceModule {

    @Provides
    public Environment provideEnvironment() {
        return environmentMock;
    }
}
您不应该“注入”到
enum
相反,使用一个好的
switch
语句,或者将注入点移动到真正可注入的对象中,比如类

为什么要注入
枚举
?这毫无意义。枚举是完全静态的。除非行为非常基本且一致,否则不应向枚举添加行为。你在这里做的事既不重要也不重要。另外,调用您的方法会非常慢,因为Guice必须在每次调用时初始化
注入器
,这绝对不是您想要的

您应该做的是将业务逻辑移到枚举本身之外:

public enum BestemmingBad implements Bestemming {
  TEST("test"), TEST2("test2");
  private final String value;
  BestemmingBad(String value) { this.value = value; }
  public String getValue() { return value; }
}

public class UrlGetter {
  private String jmsServer;
  @Inject UrlGetter(MyEnvironmentConfig config) {
    jmsServer = config.retrieveJsmServerName();
  }
  public String getUrl(Bestemming bestemming) { // or BestemmingBad
    return jmsServer + "/" + bestemming.getValue();
  }
}

这样,您的测试就不需要任何复杂的东西:只需要非常基本地测试
UrlGetter.getUrl(Bestemming)

不清楚您在问什么。您的枚举已经实现了一个接口,该接口应该使提供模拟实现变得微不足道。您试图在这里模拟什么?这是
retrieveJmsServerName
方法吗?我正在尝试模拟从中运行的计算机(不幸的是,我有多个不同的设置),我想检查此系统是否在单元测试中继续工作。将environment.class注入MyEnvironmentConfig.class
public enum BestemmingBad implements Bestemming {
  TEST("test"), TEST2("test2");
  private final String value;
  BestemmingBad(String value) { this.value = value; }
  public String getValue() { return value; }
}

public class UrlGetter {
  private String jmsServer;
  @Inject UrlGetter(MyEnvironmentConfig config) {
    jmsServer = config.retrieveJsmServerName();
  }
  public String getUrl(Bestemming bestemming) { // or BestemmingBad
    return jmsServer + "/" + bestemming.getValue();
  }
}