Java 为什么在这个JUnit测试中它显示了错误的数字?

Java 为什么在这个JUnit测试中它显示了错误的数字?,java,junit,Java,Junit,下面是我的解决方案代码: public int count_two_char(String s, char c, char d){ int count = 0; int count1 = 0; for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == c) { count = count + 1; } for (int i1 = 0;

下面是我的解决方案代码:

public int count_two_char(String s, char c, char d){
    int count = 0;
    int count1 = 0;

    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == c) {
            count = count + 1;
        }

        for (int i1 = 0; i1 < s.length(); i1++) {
            if (s.charAt(i1) == d) {
                count1 = count1 + 1;
            }
        }
    }
    return count + count1;
}

但是当我测试它的时候。它显示了一个错误,预期为4,但实际为10。为什么?我现在很困惑。

因为你的大括号缩进得不好,看起来你有两个独立的
循环。但在把它们排列得更好之后:

  for(int i=0; i<s.length(); i++){
     if(s.charAt(i) == c){
        count = count + 1;
     }


     for(int i1=0; i1<s.length(); i1++){
        if(s.charAt(i1) == d){
           count1 = count1 + 1;

        }

     }

  }

for(int i=0;i这是因为您有一个不需要的
for
循环。两个
if
s应该进入同一个循环,如下所示:

for (int i = 0; i < s.length(); i++) {
    if (s.charAt(i) == c) {
        count = count + 1;
    }
    if (s.charAt(i) == d) {
        count1 = count1 + 1;
    }
}
for(int i=0;i
目前,
d
字符的数量乘以字符串的长度,得到2+4*2=10


如果将
count=count+1
替换为等效的
count++
,则可以使代码更符合该语言的习惯。您也可以将
count1
一起删除,因为您可以在末尾添加这两个计数。

您可以使用
assertEquals(预期,实际)
。如果出现故障,它将自动显示一条与您类似的消息,而无需自己编写。您的循环是嵌套的,而事实上,您似乎需要两个单独的循环。我建议将其中一个循环全部删除,只需在遇到每个字符时比较一次。事实上,它看起来像y我们的单元测试功能正常,因为它捕捉到了您函数中的错误行为。玩得很好。
i1
从哪里来?为什么他仍然要使用
count1
?:D只是总是递增
count
。@Tom我认为保留两个计数是可以的,以防他想在调试器中看到结果,或者将它们记录在日志中r跟踪的目的。但是你是对的,一个
计数
在这里就足够了。@dasblinkenlight在这种情况下你是对的。因为他可能是编程新手,他可能想记录/跟踪这两个变量。一个熟练的程序员无论如何都会重构该方法(同时避免两个专用的计数变量):D.@Tom你说得对,专业程序员可能会采取不同的做法。例如,他们不会将其限制为
count\u两个字符
,使其成为
countChars(String s,char…chars)
,让呼叫者传递任意数量的
char
s。
for (int i = 0; i < s.length(); i++) {
    if (s.charAt(i) == c) {
        count = count + 1;
    }
    if (s.charAt(i) == d) {
        count1 = count1 + 1;
    }
}