Unit testing 如何在没有剪切复制粘贴的情况下将Spring应用程序上下文放入测试类?

Unit testing 如何在没有剪切复制粘贴的情况下将Spring应用程序上下文放入测试类?,unit-testing,junit,applicationcontext,spring-java-config,Unit Testing,Junit,Applicationcontext,Spring Java Config,我想在我的应用程序/运行代码中初始化Spring一次,并且只初始化一次(我在main(String[]args方法)中这样做) 现在我正在编写测试,我还想在我的单元测试代码中只初始化一次(但它应该已经初始化了,我的应用程序才能运行。我如何构造我的代码/类,以便我不必将复制粘贴代码从我的应用程序代码剪切到我的测试代码中,并重用在main()中初始化的相同Spring上下文 换句话说,我必须在应用程序代码中初始化,然后以某种方式传递给我的单元或系统测试代码,以便它始终具有相同的“上下文”实例 我正

我想在我的应用程序/运行代码中初始化Spring一次,并且只初始化一次(我在main(String[]args方法)中这样做)

现在我正在编写测试,我还想在我的单元测试代码中只初始化一次(但它应该已经初始化了,我的应用程序才能运行。我如何构造我的代码/类,以便我不必将复制粘贴代码从我的应用程序代码剪切到我的测试代码中,并重用在main()中初始化的相同Spring上下文

换句话说,我必须在应用程序代码中初始化,然后以某种方式传递给我的单元或系统测试代码,以便它始终具有相同的“上下文”实例


我正在初始化Spring上下文

public static void main(String[] args) {
   ...
   ApplicationContext context =
      new AnnotationConfigApplicationContext(SpringConfig.class);
   ...
}
谢谢


J.V.

您可以设置一个
@Rule
。在所有测试中使用一个单例实例。让规则保持状态并在第一次调用时设置Spring上下文。所有其他测试将只使用现有上下文。通过getter公开上下文,以便测试可以使用上下文检索bean

作为对您评论的回应…首先,这里有一个链接可供查看:

  • 通常,当您使用规则时,您会为每个类创建规则实例。在这种情况下,您会希望使用一个单例,因此使用静态
    getInstance
    方法将您的规则实现为一个单例类,测试将使用该方法共享单个实例
  • 如果您对所有测试使用同一个实例(单例),并将其作为Spring上下文的字段,那么您就有了状态
  • 让规则创建并启动Spring上下文,并让getter返回上下文,以便您的测试可以访问上下文
  • 获得者遵守规则

单元测试与应用程序不在同一个JVM中运行。它们不能共享同一上下文。只需在测试中创建一个新上下文,方法与在主JVM中执行的方法相同。@JBNizet它们上下文将被“初始化”这是OP试图避免的多次。我几乎理解你的意思;我会编写一些代码,但如果你有很好的代码示例的话。我从来没有使用过@Rule,默认情况下,所有东西都是单例的,所以我不确定我必须在那里做什么。我如何使规则保持状态(需要做什么)规则第一次是如何调用的?测试如何使用现有上下文(测试如何访问现有上下文)getter去哪里(示例类)。