首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在单元测试期间重置类静态变量

在单元测试期间重置类静态变量
EN

Stack Overflow用户
提问于 2012-08-06 22:00:29
回答 2查看 21.7K关注 0票数 19

我正在尝试为遗留代码编写单元测试。我正在测试的类有几个静态变量。我的测试用例类有几个@Test方法。因此,它们都共享相同的状态。

有没有办法在两次测试之间重置所有静态变量?

我想到的一个解决方案是显式地重置每个字段,例如:

代码语言:javascript
复制
field(MyUnit.class, "staticString").set(null, null);
((Map) field(MyUnit.class, "staticFinalHashMap").get(null)).clear();

如您所见,每个变量都需要自定义重新初始化。这种方法不容易扩展,在遗留代码库中有很多这样的类。有没有办法一次重置所有内容?也许可以通过每次重新加载类来实现?

我认为一个可能的好解决方案是使用类似powermock的东西,并为每个测试创建一个单独的类加载器。但我看不到简单的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-06 23:12:36

好了,我想我想通了。这很简单。

可以将@PrepareForTest powermock的注释移动到方法级别。在这种情况下,powermock为每个方法创建类加载器。所以它做到了我需要的。

票数 27
EN

Stack Overflow用户

发布于 2012-08-07 00:50:01

这是我的两点意见

1.将静态引用提取到getters / setters中

当您能够创建它的子类时,这是有效的。

代码语言:javascript
复制
public class LegacyCode {
  private static Map<String, Object> something = new HashMap<String, Object>();

  public void doSomethingWithMap() {

    Object a = something.get("Object")
    ...
    // do something with a
    ...
    something.put("Object", a);
  }
}

更改为

代码语言:javascript
复制
public class LegacyCode {
  private static Map<String, Object> something = new HashMap<String, Object>();

  public void doSomethingWithMap() {

    Object a = getFromMap("Object");
    ...
    // do something with a
    ...
    setMap("Object", a);
  }

  protected Object getFromMap(String key) {
    return something.get(key);
  }

  protected void setMap(String key, Object value) {
    seomthing.put(key, value);
  }
}

然后你可以通过子类化它来摆脱依赖。

代码语言:javascript
复制
public class TestableLegacyCode extends LegacyCode {
  private Map<String, Object> map = new HashMap<String, Object>();

  protected Object getFromMap(String key) {
    return map.get(key);
  }

  protected void setMap(String key, Object value) {
    map.put(key, value);
  }
}

2.引入静态设置器

这一点应该是非常明显的。

代码语言:javascript
复制
public class LegacyCode {
  private static Map<String, Object> something = new HashMap<String, Object>();

  public static setSomethingForTesting(Map<String, Object> somethingForTest) {
    something = somethingForTest;
  }

  ....
}

这两种方法都不是很好,但一旦我们有了测试,我们总是可以稍后再来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11829817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档