Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在有两个公共方法,一个调用另一个的情况下,如何进行单元测试?_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

Java 在有两个公共方法,一个调用另一个的情况下,如何进行单元测试?

Java 在有两个公共方法,一个调用另一个的情况下,如何进行单元测试?,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,当有两个公共方法且一个方法调用同一类中的另一个公共方法时,测试这些方法的方法是什么 在这种情况下,我应该如何编写单元测试 一个例子 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++) {

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

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


一个例子

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;
   }
}

是否应该考虑<代码> GETDOWN()/<代码>同时测试<代码> AddiDeCK()/Cuthor?或者我应该假设有任何默认情况吗?如果我考虑缺省情况,我会忽略输出不是默认的情况。我不确定我是否应该模仿它,因为调用的类正在被测试

你不在乎

您可以使用单元测试单独测试每个公共方法的契约。因此,您可以编写测试来确保
add()
multiply()
都执行它们应该执行的操作

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

记录在案:正如您的代码现在编写的那样;你绝对不要在这里嘲笑我。这里不需要模仿;只有增加了测试与实际生产代码无关的东西的风险。只有当您必须控制对象的各个方面以启用测试时,才可以使用模拟。但是您的示例代码中没有任何内容需要进行模拟测试。如果会的话——这将表明设计/实施不佳(考虑到这些方法的合同)

编辑;鉴于问题中的变化示例:

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

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

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

换句话说:你正在展示的代码可能会被修改/重构;例如,要更清楚地遵循。但这当然是一项更大的事业;你需要和你周围的人讨论。至少要分别测试他们。乘法测试隐式地测试加法是没有问题的。在大多数情况下,如果两种方法都必须公开,您应该问自己一个问题

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

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

假设乘法和加法分别测试,我应该能够 模拟添加

这怎么可能

使用mockito或任何其他模拟框架。你在这里能看到什么

假设乘法和加法是分开测试的,我不应该这样做 mock,我应该让add按原样执行吗


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

只需分别测试它们。当测试
乘法时,不要试图模拟
加法
,你甚至不知道
乘法
是否会调用
加法
(至少在编写测试时你不应该知道)。还要注意,当b<0时乘法会被破坏好的,如果我分别测试这两个函数,那么如何操作
乘法
[在我的例子中,我必须模拟某些
Dao
],其输出直接影响
添加
的内部结构?我使用DI来推动模拟。问题是Dao的输出是一个列表,“
add
”方法有一个
switch case
和更多的
Dao
,它们影响一些状态,我必须测试它们的参数。每个模拟都注入了依赖项。清除了错误。
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
            }
        }
    }
}