gpt4 book ai didi

通过创建执行某些工作的接口(interface)的模拟对象来进行 Java 单元测试

转载 作者:行者123 更新时间:2023-12-01 15:44:38 25 4
gpt4 key购买 nike

我不知道如何表达我想做的事情,所以我提前道歉

作为我工作的一部分,我目前正在为一些遗留代码编写单元测试。这些代码之一是 (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,并且可以轻松创建一个模拟 HttpServletResponse,并添加对 sendRedirect(url) 方法的期望(如果我知道 URL 的预期格式,但我不知道)。

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

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

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

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

最佳答案

您需要实现一个自定义匹配器。请参阅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() 检索该值。

关于通过创建执行某些工作的接口(interface)的模拟对象来进行 Java 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7322783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com