0

やりたいことをどう言葉にすればいいかわからないので、あらかじめお詫び申し上げます

私は現在、仕事の一環として、いくつかのレガシー コードの単体テストを書いています。これらのコードの 1 つは、リダイレクト URL を提供する (Java) HttpServlet です。基本的に、コードは次のようになります。

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 の期待される形式がわかっている場合)。

私の試みは、url の値を保存し、後でそれを取得できるようにする HttpServletResponse を実装して、モック クラスを作成することでした。すなわち

  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 に答える