这个程序是对跑马场的模仿
首先,与之前的项目一样,从存储库中创建一个分支:https://github.com/CodeGymCC/hippodrome,然后自己克隆这个分支。
您的任务是添加测试和日志记录。
所需测试列表
在下面的列表中,每个项目都必须作为单独的测试方法来实现。在为测试方法起名字时,尽量简洁,但同时,这样你就可以大致了解它们到底在测试什么。例如,比较这两个测试结果:
在第二种情况下,更难理解什么样的测试没有通过,您将不得不查看日志。
1.马类:
- 构造器
- 检查当作为第一个参数传递给构造函数时
IllegalArgumentException
,将被抛出null
。为此,请使用该方法assertThrows
; - 检查当作为第一个参数传递给构造函数时
null
,抛出的异常将包含消息“Name cannot be null.”。为此,您需要从捕获的异常中获取消息并使用assertEquals
; - 检查当将空字符串或仅包含空白字符(空格、制表符等)的字符串作为第一个参数传递给构造函数时,. 将被抛出
IllegalArgumentException
。要使用不同的空白字符变体进行测试,您需要使测试参数化; - 检查当将空字符串或仅包含空白字符(空格、制表符等)的字符串作为第一个参数传递给构造函数时,抛出的异常将包含消息“Name cannot be blank.”;
- 检查当一个负数作为第二个参数传递给构造函数时,
IllegalArgumentException
; - 检查当一个负数作为第二个参数传递给构造函数时,抛出的异常将包含消息“Speed cannot be negative.”;
- 检查当一个负数作为第三个参数传递给构造函数时,
IllegalArgumentException
; - 检查当将负数作为第三个参数传递给构造函数时,抛出的异常将包含消息“Distance cannot be negative.”;
- 获取名称方法
- 检查该方法是否返回作为第一个参数传递给构造函数的字符串;
- 获取速度方法
- 检查该方法是否返回作为第二个参数传递给构造函数的数字;
- 获取距离方法
- 检查该方法是否返回作为第三个参数传递给构造函数的数字;
- 如果对象是使用带有两个参数的构造函数创建的,则检查该方法是否返回零;
- 移动方法
- 检查该方法是否使用参数 0.2 和 0.9 在方法内部调用
getRandomDouble
。为此,您需要使用MockedStatic
它的方法verify
; - 检查该方法是否分配了通过以下公式计算的距离值:
distance + speed * getRandomDouble(0.2, 0.9)
。为此,您需要锁定它,getRandomDouble
以便它返回您需要通过参数化测试设置的某些值。
2.竞技场类:
- 构造器
- 检查当传递给构造函数时
IllegalArgumentException
,将被抛出null
; - 检查当传递给构造函数时
null
,抛出的异常将包含消息“Horses cannot be null.”; - 检查将空列表传递给构造函数时,将抛出
IllegalArgumentException
; - 检查将空列表传递给构造函数时,抛出的异常将包含消息“Horses cannot be empty.”;
- getHorses 方法
- 检查该方法是否返回一个列表,该列表包含与传递给构造函数的列表相同的对象并且顺序相同。创建Hippodrome对象时,将 30 匹不同马的列表传递给构造函数;
- 移动方法
- 检查该方法是否在所有马匹上调用了 move 方法。创建 Hippodrome 对象时,将 50 匹模拟马的列表传递给构造函数并使用
verify
. - 获得赢家方法
- 检查该方法是否返回具有最大距离值的马。
3.主类
- 主要方法
- 检查该方法的执行时间是否不超过 22 秒。为此,请使用超时注释。编写此测试后,将其禁用(使用 Disabled 注释)。因此运行所有测试不会花费时间,如果需要,可以手动运行。
需要记录什么
1.主类:
- 创建赛马场对象后,将如下条目添加到日志中:
2022-05-31 17:05:26,152 INFO Main: Start of the race. Number of participants: 7
- 显示有关获胜者的信息后,将如下条目添加到日志中:
2022-05-31 17:05:46,963 INFO Main: End of the race. Winner: Cherry
竞技场类:
- 如果将 null 传递给构造函数,则在抛出异常之前,在日志中添加如下条目:
2022-05-31 17:29:30,029 ERROR Hippodrome: Horses list is null
- b. 如果向构造函数传递了一个空列表,则在抛出异常之前,向日志中添加如下条目:
2022-05-31 17:30:41,074 ERROR Hippodrome: Horses list is empty
- 在构造函数的末尾,将这样的条目添加到日志中:
2022-05-31 17:05:26,152 DEBUG Hippodrome: Created a Hippodrome with [7] horses
3.马类:
- 如果将 null 而不是名称传递给构造函数,则在抛出异常之前,在日志中添加一个条目,例如:
2022-05-31 17:34:59,483 ERROR Horse: Name is null
- 如果传递给构造函数的名称为空,则在抛出异常之前,在日志中添加如下条目:
2022-05-31 17:36:44,196 ERROR Horse: Name is blank
- 如果传递给构造函数的速度小于零,则在抛出异常之前,在日志中添加如下条目:
2022-05-31 17:40:27,267 ERROR Horse: Speed is negative
- 如果传递给构造函数的距离小于零,则在抛出异常之前,在日志中添加如下条目:
2022-05-31 17:41:21,938 ERROR Horse: Distance is negative
- 在构造函数的末尾,将这样的条目添加到日志中:
2022-05-31 17:15:25,842 DEBUG Horse: Created a Horse named [Lobster] with speed [2.8]
日志应写入hippodrome.log文件,该文件应位于项目根目录的日志文件夹中。每天都应根据hippodrome.2021-12-31.log模式重命名该文件,并创建一个新的hippodrome.log。为此,请使用RollingFile appender 。在这种情况下,应该删除超过 7 天的文件。为此,您可以使用如下结构:
<DefaultRolloverStrategy>
<Delete …>
<IfFileName …/>
<IfLastModified …/>
</Delete>
</DefaultRolloverStrategy>
用谷歌搜索代替三个点的内容。😊
项目分析。完成后观看!
GO TO FULL VERSION