Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 Mockito:测试一个接受长字符串的方法_Java_Unit Testing_Mockito - Fatal编程技术网

Java Mockito:测试一个接受长字符串的方法

Java Mockito:测试一个接受长字符串的方法,java,unit-testing,mockito,Java,Unit Testing,Mockito,如果输入字符串(在我的例子中是StringBuilder)超过2048个字符,我的方法将返回一个异常。既然我们不能用Mockito模拟最终的类,谁能告诉我如何进行单元测试呢 一种方法是实际传递一个看起来很愚蠢的字符串。有没有一种简单的方法来测试这一点?Mockito的开发人员相信,传递一个模拟似乎比创建一个真正的字符串更容易。然而,创建一个真正的字符串仍然是测试中最明智的选择 您正确地注意到字符串是final,所以Mockito不能使用代理或字节码生成来为其静默地创建子类。相反,您将被迫使用,

如果输入字符串(在我的例子中是StringBuilder)超过2048个字符,我的方法将返回一个异常。既然我们不能用Mockito模拟最终的类,谁能告诉我如何进行单元测试呢


一种方法是实际传递一个看起来很愚蠢的字符串。有没有一种简单的方法来测试这一点?

Mockito的开发人员相信,传递一个模拟似乎比创建一个真正的字符串更容易。然而,创建一个真正的字符串仍然是测试中最明智的选择


您正确地注意到字符串是
final
,所以Mockito不能使用代理或字节码生成来为其静默地创建子类。相反,您将被迫使用,这实际上会使用自定义类加载器重写被测类的字节码,以使用模拟字符串.length()而不是实际实现。无论哪种方法,模拟一个简单的字符串都需要大量的工作,而且可能比其他方法需要更多的测试时间和内存

即使字符串不是
final
,您仍然要编写一个脆弱的测试,因为您(大概)只会模拟字符串的一个子集。在这个假设中,你可以写:

when(mockString.length()).thenReturn(2048);
但有一天,您的实现会转向:

public boolean isStringValid(String input) {
  // Handle Unicode surrogate pairs.
  return input.codePointCount(0, input.length()) <= 1024; // NOT 2048
}
public boolean isStringValid(字符串输入){
//处理Unicode代理项对。

返回input.codePointCount(0,input.length())IMHO,这里不需要Mockito,只需使用创建已知长度
字符串的东西(这里我使用commons lang)。我还使用它来测试异常

public class MyClassTest {
    private static int LIMIT = 2048;
    private static String TEST_STRING1 = RandomStringUtils.random(LIMIT);
    private static String TEST_STRING2 = RandomStringUtils.random(LIMIT + 1);

    @Rule
    public ExpectedException ee = ExpectedException.none();

    private MyClass myClass = new MyClass();

    @Test
    public void smallStringShouldBeOk() {
        myClass.myMethod("foobar"); // OK if no exception or assert on a returned value
    }

    @Test
    public void edgeCaseStringShouldThrow() {
        ee.expect(SomeException.class)
        ee.expectMessage("some message");

        myClass.myMethod(TEST_STRING1);
    }

    @Test
    public void tooLongStringShouldThrow() {
        ee.expect(SomeException.class)
        ee.expectMessage("some message");

        myClass.myMethod(TEST_STRING2);
    }
}

我不理解这个问题,你能再解释一点吗,或者发布一些代码吗?如果你试图抛出和异常并检查它,你应该将参数添加到@Test注释中(expected=YourException.class)为什么传递字符串是愚蠢的?我已经看到过太多的Mock-around滥用。为了记录在案,StackOverflow上已经有一个类似的问题。我不认为它是重复的,尽管这个问题是关于Mock策略而不是库功能。user2267921:是的,我正试图通过@test-annotation测试异常,但我的测试方法是thr仅当输入字符串超过2048个字符时才会出现ows异常Salex:如果以后我想在字符串超过100000个字符时引发异常,该怎么办?我不想在测试文件中创建一个大字符串常量。我想要一个字符串模拟,它可以在调用length()时像一个巨大的定义数字一样返回方法。我同意你提到的所有观点。如果字符限制从2048改为20K,或者更大。在这种情况下,你仍然建议创建一个真实的字符串吗?是的,不需要再三考虑。在任何情况下都可以使用真实的字符串,因为被测系统可能会在野外找到一个真实的字符串——2k,20K,2M。更大在测试或生产中,字符串可能不是正确的数据类型,因为字符串是大的连续不可变的内存块;我会仔细检查我的设计并考虑切换到字符序列(一个小而可仿真器的接口),然后使用某种类型的IN。NB:CARESTATE公开<代码> toString ,无论如何。