Java 是否有创建JUnit测试用例的过程?
我对Java开发相当陌生,今天是我第一次配对程序来创建测试用例。他们很友好,大声说出了他们的想法,以解释为什么要做某些事情(例如,创建一个带参数的构造函数,而不仅仅是一个默认构造函数,等等) 虽然我可能会保留我今天看到/听到的内容的40%,但我想知道是否有一套步骤/指导方针可以遵循,最终结果是一个测试用例,这将是一个很好的起点。我知道人们通常的反应Java 是否有创建JUnit测试用例的过程?,java,unit-testing,Java,Unit Testing,我对Java开发相当陌生,今天是我第一次配对程序来创建测试用例。他们很友好,大声说出了他们的想法,以解释为什么要做某些事情(例如,创建一个带参数的构造函数,而不仅仅是一个默认构造函数,等等) 虽然我可能会保留我今天看到/听到的内容的40%,但我想知道是否有一套步骤/指导方针可以遵循,最终结果是一个测试用例,这将是一个很好的起点。我知道人们通常的反应 每个商店都有自己的标准 有个人喜好和工具 取决于测试是针对您自己的类还是针对遗留类,等等 不管是哪种方式,我都这么想,也这么问了各位议员 下面是我记
这些都是我的笔记,但我想知道是否有人有一个进化的列表?你的列表中有非常不同的东西。甚至对于其中一个主题,“完整”的列表也不太可能。大多数人会写一本书,可能是倍数。这是我的书籍(和其他文档)列表,它们构成了一个比较完整的列表
- 有些似乎是关于一般良好的编码实践。例如,建议通过构造函数使用依赖注入(#1);好名字的重要性(#4)。很难列出一个完整的清单,但是有一些重要的书籍。我推荐
- 罗伯特·C·马丁的《干净的代码》
- 安德鲁·亨特和大卫·托马斯的实用程序员
- 约书亚·布洛赫的《有效的Java》
- 有些是关于Mockito的局限性,只需浏览文档和一些博客文章即可。您可能还想看看PowerMock,它试图修复Mockito和其他模拟框架的一些(大多数?)技术限制。只要阅读他们所做的事情,你就会更好地理解Mockitos的局限性
- 有些是关于设计测试、使代码可测试等等。你可以考虑以下的书籍:
- xUnit测试模式:GerardMeszaros重构测试代码
- 测试驱动:Lasse Koskela为Java开发人员提供的TDD和验收TDD
- 测试驱动开发:以Kent Beck为例
- 方法在快乐道路上的行为是什么,以及
- 边缘情况下的行为是什么
- 我的礼物,包括设置要测试的方法,包括模仿时的行为
- 我的“when I do this”子句,它本质上只是执行该方法
- 我的验证步骤,包括测试结果的一个方面
public List<String> shortenNamesFromDatabase(final int maxLength) {
List<String> names = dao.executeQuery("SELECT name from dbNames");
List<String> result = new ArrayList<String>();
for(String name : names) {
result.add(name.substring(0, maxLength);
}
return result;
}
public List shortenNamesFromDatabase(final int maxLength){
列表名称=dao.executeQuery(“从数据库名称中选择名称”);
列表结果=新建ArrayList();
for(字符串名称:名称){
result.add(name.substring(0,maxLength);
}
返回结果;
}
我有一个对数据库的调用和一些转换逻辑。我不想在这一层验证数据库信息,所以我将模拟它。在集成测试中,我确保对数据库进行调用,这会从数据库中获取每个名称
//happy path test!
@Test
public void shortenNamesFromDatabase_namesAreOnly3CharactersLong() {
//given
final int length = 3;
List<String> dbResult = Arrays.asList("Alpha","Beta", "Gamma", "Del", "Zeta12345");
Dao daoMock = mock(Dao.class);
when(daoMock.executeQuery("SELECT name from dbNames")).thenReturn(dbResult);
SomeClass testObj = new SomeClass();
//when
List<String> result = testObj.shortenNamesFromDatabase(length);
//then
for(String name : result) {
assertTrue("Name was too long!", length <= name.length());
}
}
//快乐路径测试!
@试验
来自数据库的public void shortennames\u名称仅为3个字符
//edge-case-why-would-you-ever-do-this-for-real test
@Test
public void shortenNamesFromDatabase_zeroLengthStringsTransformed() {
//given
final int length = 0;
List<String> dbResult = Arrays.asList("Alpha","Beta", "Gamma", "Del", "Zeta12345");
Dao daoMock = mock(Dao.class);
when(daoMock.executeQuery("SELECT name from dbNames")).thenReturn(dbResult);
SomeClass testObj = new SomeClass();
//when
List<String> result = testObj.shortenNamesFromDatabase(length);
//then
for(String name : result) {
assertTrue("Name was WAY too long!", length <= name.length());
}
}