当前位置: 首页 > 知识库问答 >
问题:

如果有两个公共方法,一个调用另一个,如何对其进行单元测试?

潘胤
2023-03-14

当有两个公共方法并且一个方法调用同一个类中的另一个公共方法时,测试方法的方法是什么?

在这种情况下,我应该如何编写单元测试?

一个例子

class SpecificIntMath {
   public int add(int a,int b) {
       return a+b;
   }
   public int multiply(int a, int b) {
       int mul = 0;
       for(int i = 0;i<b,i++) {
           mul=add(a,mul);
       }
       return mul;
   }
}

这个例子并没有显示所涉及的方法的复杂性,而是概念的复杂性。

我应该分别测试加法和乘法吗?如果我只测试乘法,我觉得我们错过了不能提供参数的情况。

假设要分别测试乘法加法,我应该能够模拟加法?这怎么可能?

假设要分别测试乘法和加法,我不应该模拟,我应该让加法按原样执行吗。如果是这种情况,我应该如何处理添加中的程序流?

测试这种情况的方法是什么。

编辑1:

在下面的代码中,

class MCVC {
    public boolean getWhereFrom(List<User> users) {
        boolean allDone = true;
        for(User user: users){
            String url = user.getUrl();
            switch(url) {
                case Consts.GOOGLE:
                    someDao.updateFromAddr(user);
                    user.setEntry("Search Engine");
                    break;
                case Consts.FACEBOOK:
                    someDao.updateFromAddr(user);
                    user.setEntry("Social Media");
                    break;
                case Consts.HOME:
                    someDao.updateToAddr(user);
                    user.setEntry("Company");
                default
                    user.setEntry(null);
                    allDone = false;
                    break;
            }
        }
        return allDone;
    }

    public void likedDeck() {
        List<Users> usersList = deckDao.getPotentialUsers(345L,HttpStatus.OK);
        boolean flag = getWhereFrom(usersList);

        if(flag) {
            for(User user: usersList) {
                //some Action
            }
        }
    }
}

在测试likedDeck()时,我应该考虑getWhereFrom(),还是应该假设任何默认情况?如果我考虑默认情况,我会在输出不是默认的情况下失败。我不确定我是否应该嘲笑它,因为调用的类正在测试中。测试中的间谍/模拟类

共有3个答案

南门飞
2023-03-14

我应该分别测试加法和乘法吗?

如果您正在进行单元测试,那么应该单独测试它们。您只希望在进行组件或集成测试时一起测试它们。

假设乘法和加法要单独测试,我应该能够模拟加法吗?

是呀

这怎么可能?

使用mockito或任何其他模拟框架。您可以在此处看到的确切方式使用Mockito模拟某些方法但不模拟其他方法

假设乘法和加法分别测试,我不应该模拟,我应该让加法按原样执行吗。

我不会那样做。add中的内部更改可能会影响乘法测试,您的测试会变得更加复杂和不稳定。

冯文彬
2023-03-14

至少要分别测试它们。乘法测试隐式测试加法没有问题。在大多数情况下,你应该问自己这两种方法是否都需要公开。

鄂慈
2023-03-14

你不关心。

您可以使用单元测试单独测试每个公共方法的契约。因此,您编写的测试可以确保add()multiply()都完成了它们应该做的事情。

一方在内部使用另一方的事实在外部没有任何意义。您的测试既不应该知道也不应该关心这个内部实现细节。

为了记录在案:因为你的代码是现在编写的;你绝对不能在这里转向嘲笑。这里不需要嘲笑;只会增加测试与你真正的生产代码无关的东西的风险。你只在必须控制对象的各个方面才能启用测试的情况下使用嘲笑。但是你的示例代码中没有任何东西需要模拟来测试。如果是的话——这将表明设计/实现不佳(考虑到这些方法的契约)!

编辑;给出问题中的更改示例

首先,getWhat From()中有一个错误-您迭代一个列表;但是您一直覆盖该列表中的返回值。因此,当第一次迭代将结果设置为false时;该信息可能会在下一个循环中丢失。

我认为实际问题有两种选择:

  • 你转向莫基托;并对其“间谍”概念做了部分嘲讽;如果您想保持源代码不变
  • 我个人;我宁愿花时间改进生产代码。在我看来,getWhereFrom()可能值得它自己的类(在这里,我可能不会让它处理用户列表;但只有一个用户;这也有助于返回单个布尔值;-)。当您这样做时,您可以使用依赖注入来获取“WhereFromService”类的(模拟)实例

换句话说:你正在展示的代码可以被修改/重构;例如,更清楚地遵循SRP。但这当然是一项更大的事业;你需要和周围的人讨论。

 类似资料:
  • 我需要一些软件测试方面的指导。 我把事情复杂化了,但我太专注了,看不到我做错了什么,也看不到其他做事方式。 我有几个公共方法使用相同的私有方法。 私有方法本身: 必须为其特定角色处理许多场景 假设私有方法需要5个测试来覆盖所有场景,并由6个公共方法使用。 问题 > 然后我是否需要至少5x6个测试? 如何对每个公共方法重复使用私有方法的测试? 有没有关于重构重复测试的示例/文章? 示例 OnStar

  • 有一个应用程序需要像搜寻列表这样的东西。这个应用程序可以用不同的配置多次启动。有没有办法跨JVM共享数据结构。在JVM中是有效的。有一个数据库可以解决这个问题。但是,有没有更简单、更快速的方法?

  • 嗨我正在努力解决我面临的问题 我想做的是调用test1类的zahl方法 这是我尝试过的,但它什么也没有返回,即使它应该显示我的错误。

  • 在这里,我只想确保抛出异常测试,但希望跳过调用方法在其中。我试着跟着走,但没有奏效

  • 问题内容: 我有一个直接依赖RestTemplate的类。我希望我可以离线进行JUnit测试。 如何在单元测试中模拟RestTemplate? 问题答案: 我建议重构您的客户端代码,以 消除 对的直接依赖,并用对的引用替换它,该引用是由实现的。和您应该编码的那个。 然后,您可以在代码中插入存根或模拟对象以进行单元测试,并在将其用于实际时注入。

  • 问题内容: 我有一个包含一个按钮的标题组件,并且我希望该按钮在单击时显示另一个组件(模式页面)。 我可以做这样的事情: 这是我的标头组件: 这是我的模态页面组件,单击其他组件上的按钮时应显示该组件页面: 用于模态的库:https : //github.com/marcio/react-skylight 问题答案: 更像这样: 确保在子组件上公开一个方法: 基本上,这是在将SkyLight的方法包装