什么是子类之间更好的共享变量实现

时间:2012-08-27 14:50:31

标签: spring unit-testing inheritance global-variables subclass

所以目前我有弹簧单元测试应用程序。它需要我从外部身份验证源获取会话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
  }
}

1 个答案:

答案 0 :(得分:0)

  1. 制作一个cookie工厂bean
  2. 将cookie序列化为文件,以便如果spring重新启动新的测试用例,您只需重用cookie即可。
  3. 我会将您的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");
      }
    }