Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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_String_Junit_Mocking_Mockito - Fatal编程技术网

Java 使用Mockito测试返回的字符串是否具有一定的长度

Java 使用Mockito测试返回的字符串是否具有一定的长度,java,string,junit,mocking,mockito,Java,String,Junit,Mocking,Mockito,有一个带有多个参数的方法返回一个字符串。在许多情况下,该方法会引发异常。当它返回时,字符串的内容取决于参数和插入计算机的某个USB加密狗的配置。不过,返回字符串的长度完全取决于参数 我想知道的是如何使用Mockito(我是新手)对其进行单元测试。当返回的字符串具有一定长度时,其中一个测试方法应成功完成 如果您需要更多信息,请告诉我。有这样的界面: interface Foo { void method(String s); } 一个想法是使用正则表达式匹配: final Foo moc

有一个带有多个参数的方法返回一个字符串。在许多情况下,该方法会引发异常。当它返回时,字符串的内容取决于参数和插入计算机的某个USB加密狗的配置。不过,返回字符串的长度完全取决于参数

我想知道的是如何使用Mockito(我是新手)对其进行单元测试。当返回的字符串具有一定长度时,其中一个测试方法应成功完成

如果您需要更多信息,请告诉我。

有这样的界面:

interface Foo {
    void method(String s);
}
一个想法是使用正则表达式匹配:

final Foo mock = mock(Foo.class);
mock.method("abc");
verify(mock).method(matches(".{3}"));
不幸的是,没有内置的字符串长度匹配器(应该有!),但编写自定义匹配器很容易:

private static String hasSize(final int size) {
    return argThat(new ArgumentMatcher<String>() {
        @Override
        public boolean matches(Object argument) {
            return argument.toString().length() == size;
        }
    });
}

如果你想坚持使用汉克雷斯特,托马斯兹的回答是非常好的。另外,他使用了一种描述意图的方法,而不是在验证代码中插入匿名类+他的回答是:)

但是有一种库和ArgumentCaptor的替代方法,它可以提供许多更简单的断言,而无需编写一个,并且以流畅的方式。当你有很多主张时,它会变得有点不安。以下是我大部分时间使用的内容:

@RunWith(MockitoJUnitRunner.class)
public class MyTypeTest {

    @Mock MyType myType;
    @Captor ArgumentCaptor<String> stringCaptor;

    @Test public void ensure_method_receive_String_that_has_32_chars() {
        // given
        ...
        // when
        ...
        // then
        verify(myType).method(stringCaptor.capture());
        assertThat(stringCaptor.getValue()).isNotNull().hasSize(32);
}
@RunWith(MockitoJUnitRunner.class)
公共类MyTypeTest{
@Mock-MyType-MyType;
@捕获者辩论捕获者stringCaptor;
@测试公共无效确保\u方法\u接收\u字符串\u具有\u 32\u字符(){
//给定
...
//什么时候
...
//然后
验证(myType).method(stringCaptor.capture());
assertThat(stringCaptor.getValue()).isNotNull().hasSize(32);
}

希望对您有所帮助。

因为Java 8,您可以使用以下一行代码检查长度:

verify(yourMock).theMethod(argThat(a -> a.toString().length() == LENGTH));

(使用
import static org.mockito.ArgumentMatchers.argThat;

您甚至不需要FESTAssert。只需将最后一行替换为好的老JUnit的
assertEquals(32,stringCaptor.getValue().length());
注意,如果值为null,这将给出一个NPE,但这可能没问题,因为这仍然是测试失败。如果这与您有关,您可以在它前面加上
assertNotNull(stringCaptor.getValue())
或类似。同意,尽管如此,Hamcrest或FestAssert的价值在于,它们在API中提供了更为集中的断言,并在报告的关于它们所断言类型的失败中提供了更为集中的断言。感谢Brice和David。我倾向于这个答案仅仅是因为(作为Mockito n00b)我还无法编译Tomasz的代码。但是,我想测试该方法是否返回(而不是作为参数接收)一个包含X个字符的字符串。更具体地说,X只取决于第一个参数(即字符串)的长度,有四个参数。如果需要修改答案,将如何相应地修改它?好吧,您想要的是一个不同的故事。如果我理解正确,您希望您的模拟方法返回一个字符串,该字符串是输入字符串的函数。那么验证返回的字符串是没有意义的,因为这是您的模拟;即在存根时,传递返回值。最简单的事情是使用固定的fixture和result编写一个确定性测试,这是一个简单的情况,您可以使用
given()。将返回
stubs。如果数据中可能存在非托管变体,您可以编写一个执行所需的
given(mock.method(anyString))的答案.will(使用您的答案())
尽管我的最后一句话可能表明生产代码仍然过于耦合,可能需要更多的工作才能让不同的角色与DI组合在一起。
verify(yourMock).theMethod(argThat(a -> a.toString().length() == LENGTH));