junit5 入门系列教程-25-junit5 拓展实体-存储状态(Keeping State in Extensions)

时间:2025-03-27 09:26:22

目录

  • 目录
  • 在 Extensions 中保存状态
    • 使用带有方法级范围的存储
  • 系列导航

在 Extensions 中保存状态

通常,一个扩展只实例化一次。
因此,问题变得相关了:如何将状态从一个扩展调用保存到下一个扩展?ExtensionContext API为此目的提供了一个存储。
扩展可以将值放入存储中以便以后检索。

请参阅 TimingExtension,了解如何使用带有方法级范围的存储。
重要的是要记住,在测试执行期间存储在 ExtensionContext 中的值在周围的 ExtensionContext 中不可用。
由于可嵌套扩展上下文,内部上下文的范围也可能是有限的。有关通过存储存储存储和检索值的可用方法的详细信息,请参阅相应的JavaDoc。

使用带有方法级范围的存储

import ;
import ;

import ;
import ;
import ;
import ;
import ;

public class TimingExtension implements BeforeTestExecutionCallback, AfterTestExecutionCallback {

    private static final Logger logger = (());

    private static final String START_TIME = "start time";

    @Override
    public void beforeTestExecution(ExtensionContext context) throws Exception {
        getStore(context).put(START_TIME, ());
    }

    @Override
    public void afterTestExecution(ExtensionContext context) throws Exception {
        Method testMethod = ();
        long startTime = getStore(context).remove(START_TIME, long.class);
        long duration = () - startTime;

        (() -> ("Method [%s] took %s ms.", (), duration));
    }

    private Store getStore(ExtensionContext context) {
        return ((getClass(), ()));
    }
}

Store API

扩展上下文存储绑定到其扩展上下文生命周期。

当扩展上下文生命周期结束时,它关闭关联的存储。通过调用close()方法通知属于CloseableResource实例的所有存储值。

系列导航

系列导航