使用 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

    }

}

static 字段WORD_MAX_LENGTH是一个实现细节,不应暴露给其他类(包括测试类)。


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


@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

}


BIG阳
浏览 180回答 3
3回答

慕码人2483693

通常这些字段被设置为“包私有”(即没有访问修饰符)并且单元测试被放置在同一个包上。所以常量对于来自同一个包的测试和类是可见的,而对于其他的则是隐藏的。

天涯尽头无女友

你有两个选择:暴露WORD_MAX_LENGTH在你的测试中。为测试保持第二个常数。

开心每一天1111

我可能会重新设计 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    }}然后测试布尔值。@Testpublic 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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java