有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

通过创建接口的模拟对象进行Java单元测试

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

作为工作的一部分,我目前正在为一些遗留代码编写单元测试。其中一段代码是(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”的最佳方式是什么

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

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

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

然而,因为它实现了一个接口,Java希望我实现HttpServletResponse中的所有方法,而我真的不想这么做

先谢谢你:)我会试着再说一遍


共 (3) 个答案

  1. # 1 楼答案

    您需要实现一个自定义匹配器。见Writing New Matchers

    自定义匹配器允许您准确测试所需内容,但也允许您存储传递给匹配器的值,以便您以后检索:

    从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()进行检索

  2. # 2 楼答案

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

    response.sendRedirect(with(a(String.class)));
    
  3. # 3 楼答案

    鉴于这一切都是在单元测试中发生的,您能否预测URL将是什么,从而匹配它?也就是说,使用matchers来提取您所关心的特性通常是值得的,这使得测试更加集中