0

我不知道该怎么说我想做的事,所以我提前道歉

作为我工作的一部分,我目前正在为一些遗留代码编写单元测试。这些代码之一是(Java)HttpServlet,它提供了一个重定向 URL。基本上代码如下所示:

public class Server extends HttpServlet {
  ...
  public void doGet(HttpServletRequest request, HttpServletResponse response) {
    ...
    String url = "....";
    .. // do some work to create that url
    response.sendRedirect(url);
  }
  ...
}

作为我对这个类的单元测试的一部分,我想测试创建的重定向 URL。所以我会做一些类似的事情:

 Server server = new Server();
 ..
 server.doGet(request, response);
 String url = getRedirectURL(response);
 // test URL returned
 ...

从响应中“getRedirectURL”的最佳方法是什么?

我目前正在使用JunitJmock(都是最新版本)。我创建了一个模拟 HttpServletRequest,如果我知道 URL 的预期格式,我可以轻松地创建一个模拟 HttpServletResponse 并添加对 sendRedirect(url) 方法的期望,但我不知道。

我的尝试是创建一个模拟类,实现 HttpServletResponse 存储 url 的值,然后允许我稍后检索它。IE

  private class MockHttpServletResponse implements HttpServletResponse {
  String url;
  public String getURL() {
     return url;
  }
  public void sendRedirect(String url) {
     this.url = url;
  }
 }

但是,因为它实现了一个接口,Java 希望我实现 HttpServletResponse 中我真的不想做的所有方法。

提前谢谢你:)我会尝试重新措辞

4

3 回答 3

1

您需要实现自定义匹配器。请参阅编写新匹配器

自定义匹配器允许您准确地测试您想要的,但它也允许您存储传递给匹配器的值,以便您以后可以检索它:

从 jmock 网站:

import org.hamcrest.AbstractMatcher;

public class StringStartsWithMatcher extends TypeSafeMatcher<String> {
    private String prefix;
    private String calledValue; // ADDED THIS

    public StringStartsWithMatcher(String prefix) {
        this.prefix = prefix;
    }

    public String getCalledValue() {
        return calledValue;
    }

    public boolean matchesSafely(String s) {
        this.calledValue = s; // AND HERE
        return s.startsWith(prefix);
    }

    public StringBuffer describeTo(Description description) {
        return description.appendText("a string starting with ").appendValue(prefix);
    }
}

@Factory
public static Matcher<String> aStringStartingWith( String prefix ) {
    return new StringStartsWithMatcher(prefix);
}

public class MyTestCase {
    ...

    public void testSomething() {
        ...

        TypeSafeMatcher<String> matcher = aStringStartingWith("http")

        context.checking(new Expectations() {{
            oneOf (logger).error(with(matcher));
        }});

        // more tests using matcher.getCalledValue()
        ...
    }
}

因此,您将 url 值存储在 calledValue 中,然后通过 getCalledValue() 检索该值。

于 2011-09-07T11:08:49.550 回答
0

我猜您只是想确认在响应模拟上调用了 sendRedirect 方法,但您并不关心值是什么。如果是这种情况,您可以设置这样的期望:

response.sendRedirect(with(a(String.class)));
于 2011-09-06T16:22:03.697 回答
0

鉴于这一切都发生在单元测试中,你不能预测 URL 将是什么并匹配它吗?也就是说,通常值得使用匹配器来提取您关心的功能,这使测试更加集中。

于 2011-12-30T09:28:06.730 回答