在枚举中模拟注射

时间:2018-01-11 15:57:25

标签: java dependency-injection enums guice

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

枚举:

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;
    }
}

我的测试;

{{1}}

1 个答案:

答案 0 :(得分:3)

你不应该“注入”enum

而是使用一个好的旧switch语句,或将注入点移动到像类一样真正可注入的东西。

为什么要注射enum?这没有道理。枚举完全是静态的。除非非常基本且一致,否则不应向枚举添加行为。你在这里做的事既不是。此外,调用您的方法将非常缓慢,因为Guice必须在每次调用时初始化Injector,这绝对不是您想要的。

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

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)