0

所以目前我有一个弹簧单元测试应用程序。它要求我从外部身份验证源获取会话 cookie。问题是什么,这个身份验证过程相当昂贵且耗时,我正在尝试创建一个结构,我在其中通过任何子类进行一次身份验证,并创建任何后续子类,它将重用此会话 cookie 而不会命中身份验证再次处理。

我现在的问题是,每次创建另一个子类时,静态 cookie 都是空的。而且我一直在阅读使用静态作为全局变量是一个坏主意,但是我想不出另一种方法来做到这一点,因为 Spring 框架在运行时设置了一些东西,以及我将如何设置 cookie 以便所有其他类可以用它。

另一条信息。该变量正在使用,但在运行时可以更改。它不是一个单一的用户被全面登录和使用。但更像是 Sub1 会调用登录,并且我们有一个 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. 制作一个 cookie factory bean
  2. 将 cookie 序列化为一个文件,这样如果 spring 重新启动一个新的测试用例,您就可以重用 cookie。

我会将您的 cookie 数据序列化为一个文件(每个凭证一个文件)。

如果文件太旧它不存在,那么你重新验证。

将文件放在构建输出目录中。

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 回答