【问题标题】:What would be a better implementation of shared variable among subclass子类之间共享变量的更好实现是什么
【发布时间】:2023-03-05 07:29:01
【问题描述】:

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

【问题讨论】:

  • Sub1 和 Sub2 是否扩展 Parent 仅用于访问 Cookie?还是它们也衍生出其他功能?
  • 它也继承了很多其他的功能,而且不只是Sub1或者Sub2,更像是Sub1喜欢100+,因为它是一个测试集合。
  • 除了cookie之外,Sub1、Sub2、...中还有其他状态吗?

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


【解决方案1】:
  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");
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多