0

現在、私は春の単体テストアプリケーションを持っています。また、外部認証ソースからセッション Cookie を取得する必要があります。問題は何ですか、この認証プロセスはかなり高価で時間がかかります。サブクラスによって一度認証され、その後のサブクラスが作成される構造を作成しようとしています。認証をヒットせずにこのセッション Cookie を再利用します。再度処理します。

私の問題は、別のサブクラスが作成されるたびに静的 Cookie が null になることです。そして、静的をグローバル変数として使用するのは悪い考えだと読んでいましたが、実行時にSpringフレームワークが設定するため、および他のすべてのクラスができるようにCookieを設定する方法のために、これを行う別の方法を考えられませんでしたこれを使って。

もう一つ情報です。変数は使用中ですが、実行時に変更できます。単一のユーザーがサインインして全面的に使用されるわけではありません。しかし、Sub1 が login を呼び出すようなもので、Cookie があります。次に、SubX が入ってきて、「別の資格情報を使用しているため、別の方法でログインする必要がある」と言うまで、そのログインを使用して複数のテストが行​​われます。と繰り返します。

これが私のコードの概要です:

public class Parent implements InitializingBean {
  protected static String BASE_URL;
  public static Cookie cookie;

  ... All default InitializingBean methods ...

  afterPropertiesSet() {
    cookie = // login process returns a cookie
  }
}

public class Sub1 extends Parent {
  @resource public String baseURL;

  @PostConstruct
  public void init() {
    // set parents with my baseURL;
    BASE_URL = baseURL;
  }

  public void doSomething() {
    // Do something with cookie, because it should have been set by parent class
  }
}

public class Sub2 extends Parent {
  @resource public String baseURL;

  @PostConstruct
  public void init() {
    // set parents with my baseURL;
    BASE_URL = baseURL;
  }

  public void doSomethingElse() {
    // Do something with cookie, because it should have been set by parent class
  }
}
4

1 に答える 1

0
  1. クッキー工場ビーンを作る
  2. Cookie をファイルにシリアル化して、Spring が新しいテスト ケースで再起動した場合に Cookie を再利用できるようにします。

Cookie データをファイルにシリアル化します (資格情報ごとに 1 つ)。

ファイルが古すぎて存在しない場合は、再認証します。

ファイルをビルド出力ディレクトリに配置します。

public class CookieMonster implements InitializingBean {
    private Map<String,CookieAndUrl> cookies = new ConcurrentHashMap<String,CookieAndUrl>();

    public CookieAndCurl getCookie(String username) {
        CookieAndUrl c = cookies.get(username);
        if (c == null) {
            c = b;// reauthenicate or get from file
        }
    }
    public static CookieAndUrl {
        private Cookie cookie;
        private String baseUrl;
        //getters and setters
    }
}



public class Parent implements InitializingBean {
    @Autowired
    private CookieMonster cookieMonster;
    private CookieAndUrl cu;
    public void afterPropertiesSet() {
      //maybe load which cookie you need here
      cu = cookieMonster.getCookie("tim");
  }
}
于 2012-08-29T04:50:55.510 に答える