Java Spring:在Junit中加载的类中自动连接不同的类

Java Spring:在Junit中加载的类中自动连接不同的类,java,spring,junit,autowired,Java,Spring,Junit,Autowired,我在春天有以下场景: public class ClassA{ @Autowired private ClassB classB; } 我在我的测试课上使用了(更准确地说是自动连线)ClassA。但是我想做的是修改ClassB只是为了我的Junit,这样,当ClassA在我的测试类中自动连接时,它会加载修改后的ClassB(而不是原来的) 有没有办法做到这一点?如果没有Bean配置,我想不出另一种方法来做到这一点。 您可以通过两种方式进行配置: 第一: @Configuration publ

我在春天有以下场景:

public class ClassA{

@Autowired
private ClassB classB;
}
我在我的测试课上使用了(更准确地说是自动连线)
ClassA
。但是我想做的是修改
ClassB
只是为了我的Junit,这样,当
ClassA
在我的测试类中自动连接时,它会加载修改后的
ClassB
(而不是原来的)


有没有办法做到这一点?

如果没有Bean配置,我想不出另一种方法来做到这一点。 您可以通过两种方式进行配置:

第一:

@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
    }
  }
}
秒:(摘自)


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

我认为您需要两种配置,一种用于正常执行,另一种用于测试用例。因此,基本上,您可以说创建ClassA的副本,并自动连接修改后的classB,然后在我的junit?中使用它?。我以前也这样做过,但这次我想避免这种做法。我在想是否有一种Spring机制可以帮助我做我想做的事情。这就是为什么使用接口和实现类是一个好主意。事实上,最佳实践是使用构造函数注入,这意味着您可以在根本不需要Spring的情况下运行单元测试(只需向构造函数传递一个模拟)。要通过Spring实现这一点,您必须为测试和正常执行创建单独的配置(xml或注释配置)。在测试配置中为ClassA设置ClassB的子类。根本不需要重写ClassA。
@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
  }
}