如何模拟ENUM类中的方法?

9 java junit enums jmockit

我正在为我的ENUm课程编写JUNIT测试用例.我的下面的类只会给我当前运行我的代码的机器的主机名.当我正在编写JUNIT测试时,我怎么能模拟下面的类,这样我可以随时改变getHostName()方法,这样每当我调用时getDatacenter(),它都可以通过模拟它返回我传递的任何主机名.我不想把它作为参数化的.

我只想在模拟它的同时更改主机名时测试某些情况.

public enum DatacenterEnum {
    DEV, DC1, DC2, DC3;


    public static String forCode(int code) {
    return (code >= 0 && code < values().length) ? values()[code].name() : null;
    }
    private static final String getHostName() {
        try {
            return InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
        } catch (UnknownHostException e) {
            s_logger.logError("error = ", e);
        }

        return null;
    }

    public static String getDatacenter() {
        return getHostName();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*szS 3

可以,但是不建议这样做,最好重构一下代码。

使用 Mockito/PowerMock 的工作示例

@RunWith(PowerMockRunner.class)
@PrepareForTest(DatacenterEnum.class)
public class DatacenterEnumTest {

    @Mock
    InetAddress inetAddress;

    @Test
    public void shouldReturnDatacenter() throws UnknownHostException {
        //given
        mockStatic(InetAddress.class);
        given(inetAddress.getCanonicalHostName()).willReturn("foo");
        given(InetAddress.getLocalHost()).willReturn(inetAddress);

        //when
        String datacenter = DatacenterEnum.getDatacenter();

        //then
        assertThat(datacenter).isEqualTo("foo");
    }
}
Run Code Online (Sandbox Code Playgroud)

依赖关系

  • org.powermock:powermock-module-junit4:1.5.2
  • org.powermock:powermock-api-mockito:1.5.2
  • org.assertj:assertj-core:1.5.0
  • 朱尼特:朱尼特:4.11