今天分享了djunit工具的用法。
以后在开发中需要推进。
为什么要用djunit?
1.每次跑junit都需要连接数据库,而我们不关心实际数据,只要模拟就够了。
2.每次都要启动server,慢,我们也不关心server。
3.其他相关的系统(软件和硬件)
怎么办?
1.拷贝一份测试代码,去掉关联的代码,用模拟数据代替。
2.弄一个模拟的外部环境:比如不用orcale,用hsql内存数据库。
3.用流行的jmock。
上面的三个办法都有问题:
1.改动代码需要修改测试代码,对于一些要调用框架代码的业务,要拷贝出来的东西太多。
2.模拟的环境有差异,例子中提到的用hsql,如果我们用oracle相关的函数、语法、存储过程,可能导致测试失败(而实际上代码是对的)。
3.jmock只能替换注入的类(比如spring、CDI等),而实际开发中很多都是new出来的。
可能有人说注入好,替换方便,所有的都注入吧
但是:
1.历史代码需要测试,全部改不现实
2.有些对象简单到不需要注入,或者说在可预见的未来我们不打算换,如果为了jmock来非要求开发人员必须使用注入的话,就本末倒置了---不能由测试来决定我们的设计。注入不是任何情况下都好的。
那我们要测试该怎么办呢????
顺着jmock的思路想下去:
如果new 出来的对象也能mock不就可以了么
于是找到了djunit
使用前准备:
1.有djunit的jar包—不用解释了
2.最好安装djunit的eclipse插件。
3.在testcase的setup调用MockObjectManager.initialize();方法(继承DJUnitTestCase就不用了)
4.通过djunit启动--run as djunit
public class TestService extends TestCase {
@Override
public void setUp() throws Exception {
super.setUp();
MockObjectManager.initialize();
}
public void test1() throws BusinessException {
List<Bean> lst = new ArrayList<Bean>();
lst.add(new Bean());
lst.add(new Bean());
MockObjectManager.addReturnValue(CmnDAO.class, "executeQuery", lst);
// service:return new CmnDAO().executeQuery(sql);
XXXXService service= new XXXXService();
assertEquals(2, i.geItemVOs("001").length);
}
}
例子比较简单,实际上过程可能如下:
queryData = DAO.query("select * from xxx");
......//各种复杂的业务处理
//返回业务处理结果 可能是一个状态
这时候我想mock DAO的query方法,使之直接返回我的模拟数据,然后进行业务处理、返回
最后断言,看下我的业务处理是否正确。
-------------------------------------------------------------------------
关于
MockObjectManager.addReturnValue
djunit里是用一个Map<String,List>来存储你要mock的方法和对应的值。
每次方法被执行的时候去Map中找对应的key,如果没有就交给jvm,
如果有,就取得list.get(0),直接返回给jvm的方法调用。
然后list.remove(0)。
也就是同一个方法被调多次,你需要MockObjectManager.addReturnValue多次,且顺序需要相同。
如果不想add多次,每次调用mock的方法都返回同一个值该怎么办?
MockObjectManager.setXXXAllTimes(Class,String method,Object returnvalue);
具体用法看文档或者源代码。
不能让测试工具影响开发,该注入的时候就注入,不需要就自己new,不要有后顾之忧。
分享到:
相关推荐
DJUnit是Eclipse集成开发环境中的一个插件,主要用于Java应用程序的单元测试。这个插件扩展了JUnit,使得开发者可以在Eclipse中更加便捷地进行基于DJ(Dynamic Java)的测试工作。DJUnit的名字来源于"Dynamic JUnit...
djUnit 是一个专门为Java开发的单元测试框架,它扩展了JUnit,增加了对DJANGO(一个流行的Python Web框架)的支持。Eclipse 插件是开发者在IDE中集成 djUnit 的工具,使得编写、运行和调试测试更为便捷。这个压缩包...
**Eclipse插件-Djunit详解** Djunit是由日本dgic公司开发的一款免费的Eclipse插件,专为Java开发者设计,旨在增强Eclipse的标准Junit测试框架功能。Djunit不仅支持基本的单元测试,还引入了VirtualMock技术,以帮助...
Djunit是一款专门为Eclipse集成开发环境设计的JUnit测试框架扩展。它允许开发者在Eclipse中方便地进行DJango项目的单元测试。DJunit的核心功能是将JUnit的测试框架与Django框架紧密结合,使得开发者能够在Eclipse...
《Djunit 0.8.2:Eclipse 插件测试框架的探索与实践》 Djunit,全称为"Djunit包",是一款专为Eclipse集成开发环境设计的单元测试框架,其版本号为0.8.2。这款工具的核心功能是帮助Java开发者在Eclipse环境下对JDT...
关于Eclipse的djunit djUnitは、「テストされたコード」と「テストされていないコード」をレポート表示します。このレポートを参考にテスト不足を解消させることで、テストの品質が向上し、プログラムの品質が向上し...
djunit0.8.3djunit0.8.3djunit0.8.3
djunit_plugin_for_eclipse_4.7-4.18 Eclipse版本4.7的djUnit插件-4.18(2020-12) 当前版本0.9.0 蚀版本 代码名称 4.7 氧 4.8 光子 4.9 2018-09 4.10 2018-12 4.11 2019-03 4.12 2019-06 4.13 2019-...
Java CheckStyle 是一款非常重要的静态代码分析工具,主要用于...而`05_djUnit`可能涉及到的单元测试,则是软件开发过程中的另一个关键环节,用于验证代码的功能正确性。两者结合,能为Java项目提供全方位的质量保障。
hibernate二级缓存EHCache所需jar包
5. **DJUnit Task**:用于运行单元测试。 6. **Metrics Task**:用于收集代码质量指标。 7. **Jar Task**:用于打包成jar文件。 8. **Javadoc Task**:用于生成API文档。 **示例:** ```xml ${src.dir}" destdir=...