Java 我是否可以在junit中测试一个方法来判断一个字符是否在重复

Java 我是否可以在junit中测试一个方法来判断一个字符是否在重复,java,junit,Java,Junit,我需要测试一个方法,该方法检查一个字符是否在JUnit中重复,当我运行测试时,它会说:false public boolean isRepeated(char ch) { ch = Character.toUpperCase(ch); for (char letter : guessLetter) {// guessLetter is a character ArrayList if (letter == ch) {

我需要测试一个方法,该方法检查一个字符是否在JUnit中重复,当我运行测试时,它会说:false

public boolean isRepeated(char ch) {

        ch = Character.toUpperCase(ch);
        for (char letter : guessLetter) {// guessLetter is a character ArrayList 
            if (letter == ch) {
                return true;

            }
        }
        return false;
    }

@Test
    void test() {
        game game=new game();
        boolean res=false;
        char c='A';
        res =game.isRepeated(c);
        String words = new String("AAAA");
        ArrayList<Character> guessLetter = new 
ArrayList<Character>();
        for ( int i=0; i<words.length(); i ++) {
            guessLetter.add(words.charAt(i));

        }

        assertEquals(res, guessLetter);


    }   

res的类型为boolean。guessLetter的类型为ArrayList。因此,它们永远不会相等,您的测试将永远失败。

这里有一些问题,但让我们从低挂果实开始

public boolean isRepeated(char ch) {

        ch = Character.toUpperCase(ch);
        for (char letter : guessLetter) {// guessLetter is a character ArrayList 
            if (letter == ch) {
                return true;

            }
        }
        return false;
    }

@Test
    void test() {
        game game=new game();
        boolean res=false;
        char c='A';
        res =game.isRepeated(c);
        String words = new String("AAAA");
        ArrayList<Character> guessLetter = new 
ArrayList<Character>();
        for ( int i=0; i<words.length(); i ++) {
            guessLetter.add(words.charAt(i));

        }

        assertEquals(res, guessLetter);


    }   
你的操作顺序是错误的。您希望在运行测试之前设置列表

public boolean isRepeated(char ch) {

        ch = Character.toUpperCase(ch);
        for (char letter : guessLetter) {// guessLetter is a character ArrayList 
            if (letter == ch) {
                return true;

            }
        }
        return false;
    }

@Test
    void test() {
        game game=new game();
        boolean res=false;
        char c='A';
        res =game.isRepeated(c);
        String words = new String("AAAA");
        ArrayList<Character> guessLetter = new 
ArrayList<Character>();
        for ( int i=0; i<words.length(); i ++) {
            guessLetter.add(words.charAt(i));

        }

        assertEquals(res, guessLetter);


    }   
现在让我们讨论一下实际测试数据的问题。从您所展示的内容来看,不清楚guessLetter是否是游戏中的一个字段,或者它是否是测试类中的一个字段,或者您的测试类是否与实际代码定义在同一个类中,您不应该这样做

public boolean isRepeated(char ch) {

        ch = Character.toUpperCase(ch);
        for (char letter : guessLetter) {// guessLetter is a character ArrayList 
            if (letter == ch) {
                return true;

            }
        }
        return false;
    }

@Test
    void test() {
        game game=new game();
        boolean res=false;
        char c='A';
        res =game.isRepeated(c);
        String words = new String("AAAA");
        ArrayList<Character> guessLetter = new 
ArrayList<Character>();
        for ( int i=0; i<words.length(); i ++) {
            guessLetter.add(words.charAt(i));

        }

        assertEquals(res, guessLetter);


    }   
案例1:游戏是场的所有者 通过提供要使用的测试数据,在调用测试之前移动测试数据初始化。如果您缺少猜字母的setter,请在中添加一个

public boolean isRepeated(char ch) {

        ch = Character.toUpperCase(ch);
        for (char letter : guessLetter) {// guessLetter is a character ArrayList 
            if (letter == ch) {
                return true;

            }
        }
        return false;
    }

@Test
    void test() {
        game game=new game();
        boolean res=false;
        char c='A';
        res =game.isRepeated(c);
        String words = new String("AAAA");
        ArrayList<Character> guessLetter = new 
ArrayList<Character>();
        for ( int i=0; i<words.length(); i ++) {
            guessLetter.add(words.charAt(i));

        }

        assertEquals(res, guessLetter);


    }   
@Test
void test() {
    String words = "AAAA";
    ArrayList<Character> guessLetter = new ArrayList<Character>();
    for (int i = 0; i < words.length(); i++) {
        guessLetter.add(words.charAt(i));

    }
    game game = new game();
    game.setGuessLetter(guessLetter);

    assertEquals(true, game.isRepeated('A'));
}
注意这里也没有多余的变量;我们想要测试的一切都是显而易见的

public boolean isRepeated(char ch) {

        ch = Character.toUpperCase(ch);
        for (char letter : guessLetter) {// guessLetter is a character ArrayList 
            if (letter == ch) {
                return true;

            }
        }
        return false;
    }

@Test
    void test() {
        game game=new game();
        boolean res=false;
        char c='A';
        res =game.isRepeated(c);
        String words = new String("AAAA");
        ArrayList<Character> guessLetter = new 
ArrayList<Character>();
        for ( int i=0; i<words.length(); i ++) {
            guessLetter.add(words.charAt(i));

        }

        assertEquals(res, guessLetter);


    }   
案例2:游戏不是guessLetter的所有者 重构代码,使游戏成为guessLetter的所有者,并参考案例1

public boolean isRepeated(char ch) {

        ch = Character.toUpperCase(ch);
        for (char letter : guessLetter) {// guessLetter is a character ArrayList 
            if (letter == ch) {
                return true;

            }
        }
        return false;
    }

@Test
    void test() {
        game game=new game();
        boolean res=false;
        char c='A';
        res =game.isRepeated(c);
        String words = new String("AAAA");
        ArrayList<Character> guessLetter = new 
ArrayList<Character>();
        for ( int i=0; i<words.length(); i ++) {
            guessLetter.add(words.charAt(i));

        }

        assertEquals(res, guessLetter);


    }   
案例3:测试代码与实际代码在同一个类中
重构你的代码,使你有两个独立的类;一个用来测试代码,另一个用来运行代码。然后,请参阅案例1。

@Progman-我觉得这里有很多代码至少可以得出合理的答案……因为该方法是布尔的。我该怎么解决呢?另外,调用isRepeated时还没有设置guessLetter,至少从我们看到的情况来看,isRepeated不会检查重复的字母,只检查给定字符的存在。这很好,但我不能说一切都非常清楚。我会将列表的创建从字符串移动到助手方法,并将guessLetter声明为接口的列表代码,而不是实现。@DavidConrad:我同意,但我不想一次过多地重载它们。guessLetter是游戏中的一个字段。你从哪儿弄来的那封信?@KalidDiriye:是我变出来的。你需要有一种方法将你构建的字母放入你的类中,setter是最快的方法。
public boolean isRepeated(char ch) {

        ch = Character.toUpperCase(ch);
        for (char letter : guessLetter) {// guessLetter is a character ArrayList 
            if (letter == ch) {
                return true;

            }
        }
        return false;
    }

@Test
    void test() {
        game game=new game();
        boolean res=false;
        char c='A';
        res =game.isRepeated(c);
        String words = new String("AAAA");
        ArrayList<Character> guessLetter = new 
ArrayList<Character>();
        for ( int i=0; i<words.length(); i ++) {
            guessLetter.add(words.charAt(i));

        }

        assertEquals(res, guessLetter);


    }