所以目前我有弹簧单元测试应用程序。它需要我从外部身份验证源获取会话cookie。问题是什么,这个身份验证过程是相当昂贵和耗时的,我试图创建一个结构,我通过任何子类进行一次身份验证,并创建任何后续子类,它将重用此会话cookie而无需验证身份验证再过程。
我现在的问题是,每次创建另一个子类时,静态cookie都为null。我一直在阅读使用静态作为全局变量这是一个坏主意,但我无法想到另一种方法,因为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
}
}
答案 0 :(得分:0)
我会将您的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");
}
}