Spring:在Junit中加载的类中自动装配不同的类

Posted

技术标签:

【中文标题】Spring:在Junit中加载的类中自动装配不同的类【英文标题】:Spring: Autowire different class inside of a class loaded in Junit 【发布时间】:2018-04-06 00:20:59 【问题描述】:

我在 Spring 中有以下场景:

public class ClassA

@Autowired
private ClassB classB;

我在我的测试课程中使用(更准确地说是自动装配)ClassA。但是我想做的只是为我的Junit修改ClassB,所以当ClassA在我的测试类中自动装配时,它会加载修改后的ClassB(而不是原来的)。

有没有办法做到这一点?

【问题讨论】:

我认为您需要两种配置,一种用于正常执行,一种用于测试用例。 所以基本上,你说创建一个 ClassA 的副本,并自动装配一个修改后的 classB,然后在我的 junit 中使用它?我以前做过,但这次我想避免这种方法。我在想是否有一个 Spring 机制可以帮助我做我想做的事情。 这正是为什么使用接口和实现类是个好主意的原因。实际上,最佳实践是使用构造函数注入,这意味着您可以在完全不需要 Spring 的情况下运行单元测试(只需将模拟传递给构造函数)。 要通过 Spring 执行此操作,您必须为您的测试和正常执行创建单独的配置(xml 或注释之一)。在您的测试配置中为 ClassA 设置 ClassB 的子类。完全不需要重写ClassA。 【参考方案1】:

想不出没有 Bean 配置的其他方法。 您可以通过 2 种方式进行配置:

第一:

@Configuration
public class AppConfig 

  @Bean
  public ClassB classB() 
    return new ClassB() 
      // this is a subclass that inherits everything from ClassB, so override what you want here
    
  

第二:(取自here)

@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest 

  // do this if you only want the modified classB in 1 place
  @Configuration
  static class TestConfig 
      @Bean
      public ClassB classB () 
          return new ClassB() 
            // same as the first
          
      
  

  @Test
  public void testMethod() 
    // test
  

最后,您可以在主文件夹中创建新接口ClassBClassBImpl,在测试文件夹中创建ClassBTestImpl。您仍然需要使用其中一种配置。

【讨论】:

以上是关于Spring:在Junit中加载的类中自动装配不同的类的主要内容,如果未能解决你的问题,请参考以下文章

Spring JUnit:如何在自动装配组件中模拟自动装配组件

Spring 3 和 JUnit 4(自动装配)

在Camel JUnit中自动装配Spring Bean

从 JUnit 运行时 Spring 不会自动装配

Spring Boot 自动装配配置类进入 Junit 测试

在 JUnit 5 测试中模拟 Spring Boot 2 应用程序的自动装配依赖项