我需要使用 Junit/Mockito 来测试这个方法。实际上,我无法使用 Mockito 正确编写测试,因此我使用了自己的输入而不是模拟扫描仪。我不知道我做对了没有。(有人知道如何用mockito制作吗?)
这是我要测试的方法:
public RentingACar rentACar(Scanner input) {
RentingACar rentingACar = new RentingACar();
System.out.print("Brand: ");
rentingACar.setBrand(input.next());
System.out.print("Name: ");
rentingACar.setName(input.next());
System.out.print("Surname: ");
rentingACar.setSurname(input.next());
System.out.print("Rent Date: ");
rentingACar.setRentDate(input.next());
System.out.print("Client number: ");
rentingACar.setClientNumber(input.nextInt());
return rentingACar;
}
这是我的测试:
@Test
void rentACar() {
Scanner scanner = new Scanner("Mazda\nPeter\nParker\n20.02\n1234");
ClientDataGetter clientDataGetter = new ClientDataGetter();
RentingACar rentingACar = clientDataGetter.rentACar(scanner);
assertNotNull(rentingACar);
assertEquals("Mazda", rentingACar.getBrand());
assertEquals("Peter", rentingACar.getName());
assertEquals("Parker", rentingACar.getSurname());
assertEquals("20.02", rentingACar.getRentDate());
assertEquals(1234, rentingACar.getClientNumber());
}
有什么意义吗?
为什么在不需要 Mockito 时要使用 Mockito,见鬼,使用 Mockito 编写它比没有它时遇到更多问题?Mockito 是完全不得已的选择(例如模拟数据库或外部服务),即便如此,您是否应该使用它(而不仅仅是编写自己的FakeDatabase
或FakeExternalService
)也是值得怀疑的。这里绝对不需要,嘲笑Scanner
甚至有什么帮助?
我会说你的方式很好,即使你正在测试的代码还有很多不足之处。由于这个问题是关于测试的,我不会谈论代码本身。
您只测试了所谓的happy-path,这意味着输出完美且一切正常的情况。
您还需要做的是测试边缘情况(当输入处于最大值/最小值时,例如数字中的 L.MIN_VALUE/0/Long.MAX_VALUE,字符串中的 0 长度等),例如使用空/一个字母名称,客户编号以 0 开头。
毕竟你需要测试输入是否简单:没有\n
迹象,没有日期应该是什么日期等等,这里有很多可能性。您可能会发现您的代码不够用,您将不得不对其进行更改(可能添加一些输入验证)。这就是为什么从测试(测试驱动开发)开始是好的原因,您可以在编写代码之前看到您必须进行验证,并且您将为此做好准备。这是一个简单的案例,但向现有代码添加重要功能并不总是那么容易,如果该代码已被某人使用,甚至可能存在风险。我见过很多人需要做这样的修改的情况,但如果没有大量的重构,这是不可能的,所以这就是他们所做的(请不要这样做):
if(mySpecialCase) {
// all the logic
} else {
// all the logic, almost identical to the logic above
}
编辑:回复您的评论- Why is it bad practice to make if conditions?
我不只是在谈论if
这里的条件。我说的是两个if
分支中潜在的代码重复,它们很可能具有非常相似的代码。想象一下,您要进行另一个更改,您必须if
向两个分支添加另一个,这会变得一团糟。
If
条件也不应该被过度使用,尤其是当它归结为许多不同的分支时。仅通过查看代码就很难调试、测试和查看发生了什么。某人(或您)仅通过查看和分析代码就知道代码做了什么,这一点非常重要。解决这个问题通常并不容易,需要使用一些设计模式,比如装饰器,有时即使是一个简单的开关也会有很大帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句