假设我有一个这样的课:
public class MyClass { Dao dao; public String myMethod(Dao d) { dao = d; String result = dao.query(); return result; } }
我想用模拟测试。因此,我创建了一个模拟对象,然后以这种方式调用方法进行测试:
Dao mock = Mockito.mock(Dao.class); Mockito.when(mock.myMethod()).thenReturn("ok"); new MyClass().myMethod(mock);
但是,假设我有一个类似的类:
public class MyClass { Dao dao = new Dao(); public String myMethod() { String result = dao.query(); return result; } }
现在我无法将模拟作为参数传递,那么我该如何测试我的方法呢?有人可以举个例子吗?
从根本上讲,您正在尝试用替代实现替换私有字段,这意味着您违反了封装。您唯一的其他选择是重组类或方法,以使其更好地设计用于测试。
评论中有很多简短的答案,因此我在这里将它们汇总(并添加了我自己的一些观点)作为Community Wiki。如果您有其他选择,请随时在此处添加。
重组班级 为有问题的字段创建设置器,或放宽该字段的可见性。
创建采用DAO的依赖项注入重写或静态方法,并使公共实例方法委托给它。而是测试更灵活的方法。
public String myMethod() { return myMethod(dao); } String myMethod(Dao dao) { /* real implementation here */ }
添加构造函数重载或静态工厂方法以替换私有字段以进行测试。
完全构造用于依赖项注入的类。(索蒂里奥斯扎Delimanolis,EJK)
请注意,如果将测试放在相同的Java包中(可能在单独的源代码树中),则其中某些测试包可能是私有的。在任何情况下,好名字和文档都有助于使您的意图清晰明了。