使用Junit对边缘案例进行单元测试

时间:2018-08-20 20:59:20

标签: java unit-testing junit

我有一个名为StringProcessor的实用程序类。其中的breakLongWords()方法在字符序列缺少预定义长度的空白时将零宽度空格添加到输入中:

public class StringProcessor {

    private static final int WORD_MAX_LENGTH = 40;

    public String breakLongWords(CharSequence input) {
        // add a zero-width space character after a word
        // if its length is greater than WORD_MAX_LENGTH and doesn't have any space in it
    }
}

静态字段WORD_MAX_LENGTH是实现的详细信息,不应暴露给其他类(包括测试类)。

现在,如何在不访问WORD_MAX_LENGTH的情况下在JUnit中测试边缘情况?例如:

@Test
public void breakLongWords_EdgeCase() {
    String brokenText = stringProcessor.breakLongWords
            ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // its length should be = WORD_MAX_LENGTH 

    assertEquals(41, brokenText.length()); // 41 (WORD_MAX_LENGTH + 1) is also hard-coded here
}

3 个答案:

答案 0 :(得分:4)

通常,将此类字段设置为“包私有”(即没有访问修饰符),并将单元测试放在同一包中。
因此,对于同一包中的测试和类而言,常量是可见的,而对于其他程序包则为常量。

答案 1 :(得分:2)

您有两种选择:

  1. WORD_MAX_LENGTH暴露在测试中。

  2. 维护用于测试的第二个常量。

答案 2 :(得分:0)

我可能会重新设计StringProcessor和测试。

public class StringProcessor {

    private static final int WORD_MAX_LENGTH = 40;

    public boolean stringLengthIsSafe(CharSequence input){
        if(input.length()>WORD_MAX_LENGTH){
           return false;
        }
        return true;
    }

    public String breakLongWords(CharSequence input) {
        // add a zero-width space character after a word
        // if its length is greater than WORD_MAX_LENGTH and doesn't have any space in it
    }
}

然后在布尔值上进行测试。

@Test
public void breakLongWords_EdgeCase() {
    boolean safeString = stringProcessor.stringLengthIsSafe
            ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // its length should be = WORD_MAX_LENGTH 

    assertEquals(true, safeString); // 41 (WORD_MAX_LENGTH + 1) is also hard-coded here
}

在您的最终实现中,breakLongWords可以在尝试对CharSequence进行任何操作之前实现stringLengthIsSafe。