2012-12-12 46 views
0

您好:通常您使用模拟(Java代理)来替换类中的对象。Java,实例替换而不是模拟

例如:

public class ClassA{ 
    public ClassB realObjectB; 
    public ClassC realObjectC; 


    public void Method1(){ 
     realObjectC = new ClassC(); 
     realObjectB = new ClassB(realObjectC); 
    }  

    ... 

    ... 

}

public class ClassB { 


     public void ParticularInhereitedMethod(){ 
      many dependency objects involved... 
     } 

} 
当然

,ClassB的和ClassC有很多其他的依赖,例如连接池。

当我做测试,我可以这样做:

public class Mock extends ClassB{   

@override 
public class ParticularInhereitedMethod(){ 
     Make clean codes, no dependency. 
} 

}

在测试应用程序:

public class MainClass{ 

      public static void main(String[] args){ 
        ClassA a = new ClassA(); 
        ClassM m = new Mock(); 
        a.realObjectB = m; 

        manipulate m; 
      } 

    } 

这是上面的方法在实际的测试工作?为什么我必须使用Java代理(字节代码替换)?

+2

我认为你在混淆模拟对象的概念和一些库实现它们的方式。 模拟对象正是您在代码中显示的内容,并且您没有使用Java代理。他们工作。 有一些模拟库在生成模拟对象时非常强大。这些可能使用java代理或类似的东西来建立这些对象。 – Jochen

+0

我的方法错了还是对吗?我必须使用mockito还是使用以下两个答案建议的依赖注入? – user84592

回答

2

我建议使用Mockito http://code.google.com/p/mockito/和Spring注入来解决你的问题。

用的Mockito土特产品可以宣布从参数的对象上返回参数,春暖花开,你可以在运行时解析对象的实例

+0

适合工作的正确工具 – tucuxi

+0

我的方法错了还是对吗?我必须使用mockito还是使用以下两个答案建议的依赖注入? – user84592

+0

您的方法的问题是a.realObjectB = m,通过这种方式,如果属性应该是私有的,那么您将仅公开测试。我认为你应该接受春天和控制权的倒退,所以你可以注入你的对象的权利。 –

1

你可能会发现很难模拟出/替换为你的对象是相对复杂。我会考虑以更简单的方式测试它们的方法,并使用依赖注入来允许您在不进行子分类的情况下替换它们的实现。

+0

我的方法错了吗?我必须使用mockito还是使用以下两个答案建议的依赖注入? – user84592

相关问题