如何自动装配服务,进而在 Junit 中自动装配另一个服务
Posted
技术标签:
【中文标题】如何自动装配服务,进而在 Junit 中自动装配另一个服务【英文标题】:How to autowire service which in turn autowires another service in Junit 【发布时间】:2020-09-08 13:04:57 【问题描述】:TestSomething.class :
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "application-context-junit" )
public class TestSomething
@Autowired
ISomeService someService;
...// more code
SomeServiceImpl.class :
@Service("someService")
public class SomeServiceImpl implements ISomeService
@Autowired
ISomeAnotherService someAnotherService;
..//more code
application-context-junit.xml:
<context:component-scan base-package="com.basepackage.*" />
所以,我的问题是 如果我在 application-context-junit.xml 中提供组件扫描来处理所有 Autowires 是否足够,或者我是否也应该在 xml 中添加以下内容?
<context:component-scan base-package="com.basepackage.*" />
<bean id="someService" class=""com.basepackage.SomeServiceImpl"" />
<bean id="someAnotherService" class=""com.basepackage.SomeAnotherServiceImpl"" />
【问题讨论】:
为什么要使用单独的配置进行测试,而不是使用现有的配置?如果服务被注释,您只需要组件扫描。但是,如果您只想测试服务(并且实际上并不需要 spring),那么只需创建一个服务实例并自己注入它们。 @M.Deinum 感谢您的回复。我创建了单独的配置只是为了理解。我要测试的服务中有很多自动连接。所以我这里需要春天 它应该只适用于组件扫描,前提是您的ISomeAnotherService
的 impl 也被正确注释,例如与@Component
或@Service
或类似。一句忠告;避免使用大型测试上下文,因为这些会成为它们自己的维护负担,并且会很快变得复杂。我发现其他项目正在针对存根运行测试,并因此天真地通过了。
【参考方案1】:
每次使用字段注入时,单元测试都会死掉!
不要使用归档注入,因为这不是一个好习惯。此外,当 Spring 必须为每个测试注入类时,它会减慢测试速度。
正如您在 Article 中所读到的,最好使用构造函数或 setter 注入。
这种类型的注入可以很容易地模拟被测试组件使用的所有组件,如下所示:
import org.junit.Before;
import org.mockito.Mockito;
public class MyBeanTest
private MyBean target = new MyBean();
private AnotherBean anotherBean = Mockito.mock(AnotherBean.class);
@Before
public void setUp()
myBean.setAnotherBean(anotherBean);
//Tests...
【讨论】:
如果您需要集成测试而不是单元测试,您的方法将不起作用。此外,Spring 将在运行之间缓存上下文,因此只有在配置更改时(在编写集成测试时不应该经常发生),每个测试都不会发生注入。 @Sebastian 我有兴趣在没有 Mockito 的情况下这样做 @M.Deinum 你是对的,如果你想编写一个集成测试,你需要 Spring 框架来注入所有依赖项。但是我使用构造函数或 setter 注入的方法是正确的,因为通常您正在编写单元测试和集成测试。以上是关于如何自动装配服务,进而在 Junit 中自动装配另一个服务的主要内容,如果未能解决你的问题,请参考以下文章
获取在 Junit 中自动装配的 @ConfigurationProperties bean