2012-08-27 27 views
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 
    } 
} 
+0

Sub1和Sub2是否只为访问Cookie而扩展Parent?或者他们也获得其他功能? – jeff

+0

它还继承了许多其他功能,它不仅仅是Sub1或Sub2,而且更像Sub1,喜欢100+,因为它是一组测试。 – Churk

+0

Sub1,Sub2,...以外的其他国家是否有cookie? – jeff

回答

0
  1. 制作饼干工厂bean
  2. 序列化饼干到一个文件,这样,如果上一个新的测试用例春天reinits你可以重用曲奇饼。

我会将您的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"); 
    } 
}