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
最后,您可以在主文件夹中创建新接口ClassB
和ClassBImpl
,在测试文件夹中创建ClassBTestImpl
。您仍然需要使用其中一种配置。
【讨论】:
以上是关于Spring:在Junit中加载的类中自动装配不同的类的主要内容,如果未能解决你的问题,请参考以下文章
Spring JUnit:如何在自动装配组件中模拟自动装配组件