我在工程 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的时候调用的不是原来的类的方法,而是自己为了测试而编写的类呢?
{
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的时候调用的不是原来的类的方法,而是自己为了测试而编写的类呢?
测试懂的不太多,我觉得先测试OtherClass.xxx方法和UtilityClass.yyy方法
这两个方法没问题,在测试 public void foo() 方法
编写 OtherClass, UtilityClass 和编写 DemoClass 不是同一个人
而且测试 OtherClass UtilityClass 需要花很多时间
所以
就不应该先测试 OtherClass 和 UtilityClass 的
写的有点混乱 而且跟题目也有点…… 呵呵现在整理一下为了说明问题
下面拿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
<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();
}代码是手写的,仅供参考
不过这么做的话被测试的类就与很多测试有关的代码混合在一起了
能不能不修改被测试的类啊
要将被测试的代码和测试的代码清楚的分开来的
ModelFactory.CreateInstance()
这样的形式么?
工程里面new的地方这么多
是不是每个地方都要这样子啊?
我希望还是使用new就好
∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞力争成为中国最大的架构师群联盟,架构师技术交流群:28995710已接近尾声,62402336正式开放!!!已经上传的顶级软件产品的架构分析,本群资料仅供研究学习,不得商用!!!
google 、
eBay、
Youtube、
淘宝等
......
技术文章包括:
《自己动手写操作系统》
《搜索引擎-原理、技术与系统》
《企业应用架构模式》
......
重要的RUP实例
设计模式精解
......
资料陆续上传中
∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞
但是仅仅为了测试而使用这项特性那也太~~~~~那个~~~~~了~~~
说不定在某个地方迫不及待的new一个对象然后就直接调用其方法了
比如用到了一个不是很重要的类(没有必要通过接口访问)
testjavaprj 的class B 可以去继承 javaprj中的class B,然后重写方法public int getValue()