我正在经历一个困难的时间,弄清楚如何解决单元测试问题。我很少或没有'单元测试'的经验。我试图只在绝对必要的情况下用最小的更改来更改classUnderTest。如何Java单元测试一个复杂的类
我使用的是JUnit 4,我愿意尝试使用Mockito,JMockit或任何其他有助于进行高效且有效的单元测试的库。我正在为数据库使用JDBC。
问题:
内classUnderTest,我访问静态数据库。
SpecializedDao specializedDao = SpecializedDao.getSpecializedDao();
ObjectX objectResult = specializedDao.currentObjectXByTimestamp(x, x, x, x, x, x);
我试图用一个有效的配置和一个无效的配置做单元测试用例。解决这个问题的正确方法是什么?
一些可能解决方案,我已经研究有:
- 不知怎么传递,或者“注射”假ObjectXResult类_对象
- 模拟数据库(如果甚至有可能与静数据库引用,使用单独的单元测试servlet引用一个假的SpecializedDao类?)
- 使用Mockito与injectMocks,间谍,当(方法调用参数)然后返回结果,或一些其他实现Mockito规定。
- 开放给任何其他解决方案。
问题:
内classUnderTest,我使用的另一项复杂的处理类class2,做了很多工作,像这样:
result = class2.execute(x, x, x, x, x, x);
类class2做处理的东西,并返回结果ENUM或一些例外。我该如何处理这个问题,并在classUnderTest上保留此特定单元测试的范围。 class2访问数据库,并做了很多工作,这就是为什么它是它自己的类,但我认为最后三个测试用例依赖于处理以彻底测试class classUnderTest。
感谢您对我的支持,我尽可能以尽可能清晰的方式提出问题。
这听起来像你有几层在这里测试。在我的组织中,我们使用像服务层(称为dao层)和dao层(实际上调用jdbc调用)的体系结构。就单元测试而言,要考虑按班级分开你的班级。因此,对于执行实际“业务逻辑”的服务层,您可以使用EasyMock等模拟DAO调用。这将允许您将特定逻辑与服务层隔离开来。对于你的DAO层,你可以考虑使用类似嵌入式数据库(DERBY)的东西来测试 – Jason
如果你绝对不能改变类,PowerMockito允许你模拟静态方法。但我倾向于认为使用PowerMockito作为设计失败的必要性 - 可测试性应该首先是设计标准之一。 –