【问题标题】:How to update persisting state of intellij idea plugin in test class?如何在测试类中更新 intellij idea 插件的持久状态?
【发布时间】:2014-11-07 00:47:59
【问题描述】:

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

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

文档说:

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

每次保存设置时都会调用 getState() 方法(例如 例如,在帧停用或关闭 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;
  }

}

【问题讨论】:

  • 当您运行插件本身时,持久状态是否会被加载/保存?您是否使用implements PersistentStateComponent&lt;Xxx.State&gt; 模式-您可以发布一些显示此和State 类的代码吗? (它是一个内部类吗?)
  • 当我运行插件本身时它会被保存。我更新了我的问题。
  • 请看我的第二个问题:我有一些配置类,我需要存储它的几个实例。我试图在我的 State 类中创建这些对象的列表,但它不起作用。我怎样才能做到这一点?是否可以将此类对象存储在具有不同名称的不同 xml 文件中?
  • 好吧,如果插件工作正常但测试失败 - 那么问题出在测试上 ;) 您如何选择 LightPlatformTestCase 作为这种情况下的正确测试?
  • 我选择了LightPlatformTestCase,因为它提供了我需要获取我的项目和应用程序服务等的应用程序和项目。我不确定这是最好的测试,但我没有找到更好的测试。其实我的测试经验很差,几乎不存在。

标签: java testing intellij-idea intellij-plugin


【解决方案1】:

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

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

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

【讨论】:

  • 我序列化了一个相当复杂的数据(我的意思不是几个 String-s,而是几个类,里面有另一个类),我想测试我的所有数据都是“可序列化的”。我的意思是我不会错过public 修饰符或注释等。我看到我可以使用 XmlSerializer 进行序列化测试,但我希望有更直接的方法。
  • 关于存储多个实例的问题我解决了 - 我存储了它们的列表,因为我知道我不需要很多文件。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 2019-05-12
  • 2019-12-06
相关资源
最近更新 更多