2014-04-15 41 views
2

我在我的基本抽象类和静态getters/setters中使用静态成员变量。这里是我的阶级结构:在抽象类中使用静态变量

public abstract class Parent{ 
    private static XmlService xmlService; 
    //getters and setters for xmlService  
} 

这xmlService在子类用于XML转换等等。然而,在运行时根据使用其他服务的数据创建的子类的实例。现在我想用junit进行测试,并且需要模拟xmlService。如果我不使它成为静态的,我没有看到用mock初始化xmlService的任何方法。

所以我的问题是,这种方法(静态+抽象)是好的,或者它打破了任何OOP概念等。我没有看到这个问题,但只是想要一个意见。

感谢

编辑:我想根据意见,我会检讨我的设计,最有可能将与构造器注入的方式去

+0

可能是一个错字,但这是一个无效的声明语句。可能缺少变量的类型。 –

+1

你是否需要它是静态的,或者只是为了方便测试而使它变为静态的?如果除了测试之外,你不需要它是静态的,那么把它变成静态的几乎肯定是错误的。通常最好通过构造函数传递依赖关系。 –

+0

及其唯一的测试,这似乎对我来说可疑 – csn

回答

1

你的XML服务二传手 - 只需设置一个模拟对象在你的@Before方法中:

public class ParentTest { 
    private Parent parent; 
    private XmlService origService; 

    @Before 
    public void setUp() { 
     parent = new Parent() { /* anonymously implement the abstract methods */ }; 
     origService = parent.getXmlService(); 
     XmlService moxkService = Mockito.mock(XmlService.class); 
     // record some behavior... 

     parent.setXmlService(mockService); 
    } 

    @After 
    public void tearDown() { 
     // Restore the original service 
     parent.setXmlService(origService); 
    } 

    // unit tests... 
} 
+0

这就是我已经在做什么,我的问题不是如何嘲笑它,但它是否可以使用静态变量只是为了测试。 – csn