【问题标题】:Mockito argument capture within method statements方法语句中的 Mockito 参数捕获
【发布时间】:2018-02-27 16:12:27
【问题描述】:

在被测类中,我有一个方法如下:

public RedirectView directToUrl()
    {
        URL url = urlUtils.createUrl( x.getPrefix(), new URLMaker( "/my/relative/url" ) );
        return new RedirectView( url.toString() );
    }

请注意,方法本身没有任何参数。我正在尝试编写一个单元测试来验证在方法主体的第一行中传递的参数值/my/relative/url。在测试中,方法urlUtils.createUrl 不能在没有模拟的情况下按原样调用(具有副作用并且依赖于多个外部内容)。在那,我认为我不能在 Mockito 的 when-then 语句中进行参数捕获。

任何想法或想法将不胜感激。

【问题讨论】:

  • 代码中的 x 是什么?只是试图指出该方法取决于其他一些值。如果您正在对 directToUrl() 方法进行单元测试,您可以捕获 RedirectView 并根据模拟的 X 验证它是否具有正确的值。
  • x 是一个处理 HTTP 请求和围绕它构建的一些自定义内容的类。测试不必关心这个特定的参数用法。这就是为什么需要删除这个urlUtils.createUrl 的原因。
  • 我不明白你的问题是什么。所以你存根createUrl。伟大的。然后在您的测试中,您应该检查来自directToUrl 的返回值是否与您让createUrl 返回的任何URL 相匹配。哪一部分给你带来了困难?
  • 我想捕获传递给 new URLMaker( "/my/relative/url" ) 的值,而不是在测试中对其进行硬编码。
  • 在这种情况下,您可以创建间谍 URLMaker 并检查构造函数参数。如果您也发布测试代码,我们可能会为您提供帮助。

标签: unit-testing parameters arguments mockito stub


【解决方案1】:

我能够在 Mockito 中使用 AnswerdoAnswer 解决它。

public void test_directToUrl()
    {
        final String expRelUrl = "/my/relative/URL";

        Answer<URL> url = new Answer<URL>() {
            public URL answer(InvocationOnMock invocation) throws Throwable {
                URLMaker um = invocation.getArgumentAt(1, URLMaker.class);
                assertThat(um.getRelativeUrl(), equalTo(expRelUrl));
                return new URL("random_prefix" + um.getRelativeUrl());
            }
        };

        when( urlUtils.createUrl( Mockito.any(), Mockito.any() ) )
                .thenAnswer( url );
        RedirectView redirectView = directToUrl();
        assertThat(redirectView.getUrl(), containsString(expRelUrl));
    }

希望它也能帮助其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多