我在工程 DemoProject 中定义了一个类 DemoClasspublic class DemoClass
{
  public void foo()
  {
    //...
    OtherClass otherClass = new OtherClass(...);//[1]
    int ret = otherClass.xxx(...);
    ret = UtilityClass.yyy(...);//[2]
    //...
  }
}
public class OtherClass
{
  int xxx(...) { ... }
}
public static UtilityClass
{
  public static int yyy() { ... }
}
在DemoClass.foo方法的[1]处
生成了一个类OtherClass并使用到了这个类的xxx方法
假设OtherClass.xxx方法要做的事情比较复杂(如:连接数据库并获取数据,或者其他比较复杂的处理)又
在DemoClass.foo方法的[2]处
使用到了static类的yyy方法
也假设UtilityClass.yyy方法要做的事情比较复杂请问如何对 DemoClass.foo 进行测试呢?
再测试的时候怎样才能让DemoClass调用new OtherClass(...)的时候生成的是自己准备好的Mock对象呢?
以及怎样才能让DemoClass调用UtilityClass.yyy的时候调用的不是原来的类的方法,而是自己为了测试而编写的类呢?

解决方案 »

  1.   


    测试懂的不太多,我觉得先测试OtherClass.xxx方法和UtilityClass.yyy方法
    这两个方法没问题,在测试 public void foo() 方法 
     
      

  2.   


    编写 OtherClass, UtilityClass 和编写 DemoClass 不是同一个人
    而且测试 OtherClass UtilityClass 需要花很多时间
    所以
    就不应该先测试 OtherClass 和 UtilityClass 的
      

  3.   

    提问发贴比较急
    写的有点混乱 而且跟题目也有点…… 呵呵现在整理一下为了说明问题
    下面拿java来说明一下问题
    (C#中的需求跟java的需求是一样的)有一个工程javaprj
    存在一个demo.java文件
    这个文件的定义如下:package demo;public class A
    {
     public int foo()
     {
      //生成B的一个实例对象
      //B这个类由另外的开发小组进行开发
      //假设生成这个实例对象的时候
      //用到在测试环境中无法模拟的数据库等一些处理
      B b = new B();  //调用getValue方法返回一个数值
      //再次假设为了取得这个数值
      //也用到了在测试环境中无法模拟的一些数据库才做
      int value = b.getValue();  //将取到的value进行其他一些额外的操作
      //比如简单的将取回的value乘以2吧
      int ret = value * 2;
      return ret;
     }
    }
    class B
    {
     public B()
     {
       //假设再次构造函数里和数据库进行了链接
     }
     public int getValue()
     {
      int ret;
      //假设这里对数据库进行了某些查询操作
      return ret;
     }
    }下面新建了一个测试工程testjavaprj
    对javaprj工程的A.foo方法
    由于仅仅需要对A进行测试
    所以需要在testjavaprj同样的包中
    准备一个Mock类,即测试使用的B类
    testjavaprj工程建立两个文件
    testdemo.java和demo.java,定义如下demo.javapackage demo;
    public class B
    {
     private int m_value;
     public B()
     {
      //由于这个类是为了测试定义的
      //在构造函数中没有对数据库进行连接
      m_value = 10;
     }
     public int getValue()
     {
      return m_value;
     }
    }
    testdemo.javapackage testdemo;
    import demo;
    import junit.Framework.TestCase
    public class TestDemo extends TestCase
    {
     public void testFoo()
     {
      A a = new A();
      //★
      //在这里调用foo时
      //生产的是testjavaprj的B的实例
      //而非javaprj的B的实例
      //由于testjavaprj的B的构造函数中
      //已经将期望的返回值设置为10(保存于m_value)
      //所以这里的返回值是10
      int ret = a.foo();
      Assert.Equals(ret, 10);
     }
    }
    像这种情况
    在C#中应该如何进行测试啊?
    好像C#中没有上面标志为【★】的这种功能
    另:
    C#的测试结构也一样分为两个工程
    一个XXXProject和一个TestXXXProject
      

  4.   

    <appSettings>
        <add key="Debug" value="true"/>  
      </appSettings>在web.config或者app.config中增加配置。或者你设个全局变量也行在程序里写类似这样的代码,
    //这是一个创建实例的工厂
    public class ModelFactory
    {
        private static bool debugMode=Convert.ToBoolon(ConfigurationManager.AppSettings["BusinessRule1"]);
        public static object CreateInstance()
         {
             object p=null;
             if (  debugMode)
             {
                p=new A();
              }
              else
              {
                   p=new B();
               }   
               return p;
         }
    }//调用的时候是这样private void mmm()
    {
        //此处不关心如何创建实例
        object m=ModelFactory.CreateInstance();
    }代码是手写的,仅供参考
      

  5.   

    TO songhuan(烟花公子)你的方法倒是可以行得通的
    不过这么做的话被测试的类就与很多测试有关的代码混合在一起了
    能不能不修改被测试的类啊
    要将被测试的代码和测试的代码清楚的分开来的
      

  6.   

    所以生成实例的地方都要改为
    ModelFactory.CreateInstance()
    这样的形式么?
    工程里面new的地方这么多
    是不是每个地方都要这样子啊?
    我希望还是使用new就好
      

  7.   


    ∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞力争成为中国最大的架构师群联盟,架构师技术交流群:28995710已接近尾声,62402336正式开放!!!已经上传的顶级软件产品的架构分析,本群资料仅供研究学习,不得商用!!!
    google 、
    eBay、
    Youtube、
    淘宝等
    ......
    技术文章包括:
    《自己动手写操作系统》
    《搜索引擎-原理、技术与系统》
    《企业应用架构模式》
    ......
    重要的RUP实例
    设计模式精解
    ......
    资料陆续上传中
    ∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞
      

  8.   

    这么多天了还没找到解决方案 郁闷 ~~>_<~~貌似使用 ContextBoundObject 可以对 new 进行截获
    但是仅仅为了测试而使用这项特性那也太~~~~~那个~~~~~了~~~
      

  9.   

    你 可以通过接口规范 2方的关系,然后通过依赖注入解决你的问题。。java和C#不一样 是因为 ClassLoader和Assembly的区别造成的
      

  10.   

    开发过程中把所有的关系都通过接口来定义也不太实际吧 我想
    说不定在某个地方迫不及待的new一个对象然后就直接调用其方法了
    比如用到了一个不是很重要的类(没有必要通过接口访问)
      

  11.   

    不知道.NET中能不能实现这个功能啊~?
      

  12.   

    看了半天有点晕,是不是这样的呢:
    testjavaprj 的class B 可以去继承 javaprj中的class B,然后重写方法public int getValue()