Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 子类之间共享变量的更好实现是什么_Spring_Unit Testing_Inheritance_Global Variables_Subclass - Fatal编程技术网

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

Spring 子类之间共享变量的更好实现是什么,spring,unit-testing,inheritance,global-variables,subclass,Spring,Unit Testing,Inheritance,Global Variables,Subclass,所以目前我有一个spring单元测试应用程序。它要求我从外部身份验证源获取会话cookie。问题是,这个身份验证过程相当昂贵且耗时,我正在尝试创建一个结构,其中我通过任何子类进行了一次身份验证,并且创建了任何后续子类,它将重用此会话cookie,而不会再次命中身份验证过程 我现在的问题是,每次创建另一个子类时,静态cookie都是空的。我一直在读到使用static作为全局变量是个坏主意,但我想不出其他方法来实现这一点,因为Spring framework在运行时设置了一些东西,以及我将如何设置c

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

我现在的问题是,每次创建另一个子类时,静态cookie都是空的。我一直在读到使用static作为全局变量是个坏主意,但我想不出其他方法来实现这一点,因为Spring framework在运行时设置了一些东西,以及我将如何设置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
  }
}
  • 制作饼干工厂豆
  • 将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");
      }
    }
    
    公共类CookieMonster实现初始化bean{
    私有映射cookies=新的ConcurrentHashMap();
    public CookieAndCurl getCookie(字符串用户名){
    CookieAndUrl c=cookies.get(用户名);
    如果(c==null){
    c=b;//重新授权或从文件获取
    }
    }
    公共静态CookieAndUrl{
    私人饼干;
    私有字符串baseUrl;
    //接球手和接球手
    }
    }
    公共类父级实现初始化bean{
    @自动连线
    私人库克怪物库克怪物;
    私人厨师和厨师;
    公共无效afterPropertiesSet(){
    //也许在这里装上你需要的饼干
    cu=cookieMonster.getCookie(“tim”);
    }
    }
    
    Sub1和Sub2是否仅为访问Cookie而扩展父级?或者它们也衍生出其他功能?它也继承了许多其他功能,它不仅仅是Sub1或Sub2,更像是Sub1到100+,因为它是一个测试集合。Sub1、Sub2、。。。除了饼干?