2014-03-12 117 views
7

我知道这是可能的嘲笑(使用How to mock an enum singleton class using Mockito/Powermock?)一个枚举,但我有这样枚举值的1000,他们可以调用5层不同的构造。枚举值在开发中经常发生变化。JUnit测试:通过嘲笑抑制枚举构造函数?

我想真正嘲笑只为我的JUnit测试一个或两个。我不关心其余的,但他们仍然实例化,它调用一些讨厌的东西,它从文件系统加载枚举的值。

是的,我知道这是非常糟糕的设计。但现在我没有时间去改变它。

目前我们已经在使用的Mockito/powermock。但任何框架,可以解决这个问题**我的意思是糟糕的设计是值得欢迎的。

比方说,我有类似这样的枚举:

public static enum MyEnum { 
    A(OtherEnum.CONSTANT), 
    B("1"), 
    C("1", OtherEnum.CONSTANT), 
    //...and so on for again 1000 enum values :(

    private double value; 
    private String defaultValue; 
    private OtherEnum value; 

    /* Getter/Setter */ 
    /* constructors */ 
} 
+3

enum中的一个_setter_?呃,sh **确实是合适的词 – fge

+2

一个快速解决方法可能是让'enum'实现一个'interface',然后可以被模拟。这是一个黑客攻击,但可以让你现在编写你的测试,然后你应该重构 –

+0

看看[JMockit](https://code.google.com/p/jmockit/)。 –

回答

1

我与尼克 - 霍尔特同意谁建议增加一个接口:

public interface myInterface{ 

    //add the getters/setters you want to test 

} 

public enum MyEnum implements MyInterface{ 

    //no changes needed to the implementations 
    //since they already implement the methods you want to use 

} 

现在你可以使用的Mockito的正常模拟能力而不必依赖Powermock

MyInterface mock = Mockito.mock(MyInterface.class); 
when(mock.foo()).thenReturn(...); 
//..etc 
+0

如何禁止调用枚举的构造函数?这个电话是否相似?我对mockito的使用经验有限。 – keiki

+0

如果使用接口路由,那么根本不使用枚举,因此不调用构造函数。 – dkatzel

+0

因此,如果代码Enumclass.ENUM.isEnabled()中的某个地方被调用,这可能被抑制? – keiki