如何在测试类中更新intellij idea插件的持久状态?

时间:2014-11-07 00:47:59

标签: java testing intellij-idea intellij-plugin

我正在为Intellij Idea开发插件并进行一些测试。在我的一个测试中,我需要持久化状态进行更新。但它没有发生,loadStategetState都没有被调用。

我编写了实现PersistingStateComponent的类(我认为我做得正确,因为它不是我第一次这样做)。在一个测试中,我调用将数据添加到State类的方法,并且已成功添加但未保存。另一个应该获取该数据,但它变为空State。测试类实现LightPlatformTestCase.

文档说:

  

持久性组件生命周期之后调用loadState()方法   已创建组件(仅当存在某些非默认值时)   状态持久化为组件),并在XML文件后用   持久状态在外部更改(例如,如果项目   文件已从版本控制系统更新)。在后一种情况下,   该组件负责更新UI和其他相关的   根据改变状态的组件。

     

每次保存设置时都会调用getState()方法(for   例如,在帧停用或关闭IDE时)。如果是国家   从getState()返回的值等于默认状态(由。获得)   用默认构造函数创建状态类,什么都没有   坚持使用XML。否则,返回的状态被序列化   XML和存储。

这些情况是否可能发生?

我可以在测试方法中做些什么来更新我的持久状态吗?

或者它应该工作,我应该在我的代码中寻找问题?

更新:当我运行插件时,它可以正常工作。

我的班级看起来像这样:

@State(name = "MyStateName", storages = {@Storage(id="MyStateId", file = "D:/MyStateName.xml")})
public class MyClass
  implements PersistentStateComponent<MyClass.State> {

  public static class State{
    Integer someValue  = 10;
  }

  State myState = new State();

  public State getState() {
    return myState;
  }

  public void loadState(State state) {
    myState = state;
  }

  public SFApexClassWrapp getValue() {
    return myState.value;
  }

  public void addValue(Integer value) {
    myState.value = value;
  }

}

1 个答案:

答案 0 :(得分:2)

当您使用PersistentStateComponent时,您作为插件开发人员的唯一责任是返回State类的实例。因此,作为插件开发人员测试您唯一有意义的是您的实例正确返回。您不需要测试XML序列化,因为它是IntelliJ IDEA代码的一部分,这不是您的责任,并且已经经过合理的测试。

这就是为什么当IntelliJ IDEA运行代码测试时,它不会保存或加载组件的设置。如果需要,您可以手动触发设置保存,但一般情况下您无需这样做。

请发布有关存储配置对象的多个实例的单独问题。