这是对这种方法进行单元测试的好方法吗?

必须

我需要使用 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 是完全不得已的选择(例如模拟数据库或外部服务),即便如此,您是否应该使用它(而不仅仅是编写自己的FakeDatabaseFakeExternalService也是值得怀疑的这里绝对不需要,嘲笑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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

这是模拟HttpContextBase,HttpRequestBase和HttpResponseBase进行单元测试Cookie的正确方法吗?

单元测试:在单元测试方法中使用另一种方法时我做得对吗?

对调用所有简单函数的主函数进行单元测试的好方法是什么?

有什么好的方法可以对与文件系统的交互进行单元测试?

模拟远程HTTPS API进行QML应用程序单元测试的好方法是什么?

有什么好的方法可以使系统调用代理允许在单元测试中进行模拟?

单元测试-测试案例与多种方法

您在App Engine上使用了哪种方法进行轻量级Python单元测试?

单元测试改造接口声明的好方法

如何对POST方法进行单元测试

如何对空方法进行单元测试

对组件进行单元测试的正确方法

这是使用NOT IN的好方法吗?

对不适合作为新类提取的私有方法进行单元测试的好方法是什么?

单元测试可以使用被测类的方法进行测试设置吗

这是使用bash返回代码进行编程的好方法吗?

我应该对继承自超类的方法进行单元测试吗?

修改导航道具的组件方法可以进行单元测试吗?

这种方法是异步的吗?

这种方法超载吗?

对我进行依赖注入的方法进行单元测试

如何对调用 void 方法的方法进行单元测试?

这是重用/共享方法的好方法吗?

有一种方法可以在Visual Studio代码中导出单元测试的结果吗?

单元测试-一种方法,而不是50种方法

有没有一种方法可以设置要进行单元测试的类的配置设置?

有没有一种方法可以对AWS Cloudformation模板进行单元测试

如何对依赖于springBoot applicationContext的单元测试方法进行单元测试?

如何对带有枚举参数的方法进行单元测试?