当您使用 (由
default),则测试实例的依赖项将从
您配置的应用程序上下文 or related
附注。您可以使用 setter 注入和/或字段注入,具体取决于
您选择哪些 Comments,以及是将它们放在 setter 方法还是 Fields 上。
如果您使用的是 JUnit Jupiter,您还可以选择使用构造函数注入
(参见 Dependency Injection with SpringExtension)。为了与 Spring 的基于 Comments 的
injection 支持,你也可以使用 Spring 的 Comments 或 JSR-330 中的 Comments 进行 field 和 setter 注入。DependencyInjectionTestExecutionListener@ContextConfiguration@Autowired@Inject
对于 JUnit Jupiter 以外的测试框架,TestContext 框架不会
参与 Test 类的实例化。因此,使用 OR for 构造函数对测试类没有影响。@Autowired@Inject | 
对于 JUnit Jupiter 以外的测试框架,TestContext 框架不会
参与 Test 类的实例化。因此,使用 OR for 构造函数对测试类没有影响。@Autowired@Inject | 
尽管在生产代码中不鼓励使用字段注入,但
实际上在测试代码中很自然。差异的基本原理是您将
永远不要直接实例化你的测试类。因此,无需能够
在测试类上调用 constructor 或 setter 方法。public | 
尽管在生产代码中不鼓励使用字段注入,但
实际上在测试代码中很自然。差异的基本原理是您将
永远不要直接实例化你的测试类。因此,无需能够
在测试类上调用 constructor 或 setter 方法。public | 
因为 是用来按类型执行自动装配的,所以如果你有多个相同类型的 bean 定义,则不能依赖它
方法。在这种情况下,您可以在
结合。您还可以选择与 结合使用。或者,如果您的测试类可以访问其 ,则
可以通过使用(例如)对 .@Autowired@Autowired@Qualifier@Inject@NamedApplicationContextapplicationContext.getBean("titleRepository", TitleRepository.class)
如果您不希望将依赖项注入应用于测试实例,请不要注释
字段或 setter 方法与 或 .或者,您可以禁用
依赖项注入,方法是显式配置您的类并从侦听器列表中省略。@Autowired@Inject@TestExecutionListenersDependencyInjectionTestExecutionListener.class
考虑测试类的方案,如 目标 部分所述。接下来的两个代码清单演示了
使用 on fields 和 setter 方法。应用程序上下文配置
显示在所有示例代码清单之后。HibernateTitleRepository@Autowired
| 
 以下代码清单中的依赖关系注入行为并非特定于 JUnit 木星。相同的 DI 技术可以与任何支持的测试结合使用 框架。 以下示例调用静态断言方法,例如
但不在调用前加上 .在这种情况下,假设
通过未显示在
例。  | 
| 
 以下代码清单中的依赖关系注入行为并非特定于 JUnit 木星。相同的 DI 技术可以与任何支持的测试结合使用 框架。 以下示例调用静态断言方法,例如
但不在调用前加上 .在这种情况下,假设
通过未显示在
例。  | 
第一个代码清单显示了测试类的基于 JUnit Jupiter 的实现,该
场注入的用途:@Autowired
- 
Java
 - 
Kotlin
 
@ExtendWith(SpringExtension.class)
// specifies the Spring configuration to load for this test fixture
@ContextConfiguration("repository-config.xml")
class HibernateTitleRepositoryTests {
	// this instance will be dependency injected by type
	@Autowired
	HibernateTitleRepository titleRepository;
	@Test
	void findById() {
		Title title = titleRepository.findById(new Long(10));
		assertNotNull(title);
	}
}
@ExtendWith(SpringExtension::class)
// specifies the Spring configuration to load for this test fixture
@ContextConfiguration("repository-config.xml")
class HibernateTitleRepositoryTests {
	// this instance will be dependency injected by type
	@Autowired
	lateinit var titleRepository: HibernateTitleRepository
	@Test
	fun findById() {
		val title = titleRepository.findById(10)
		assertNotNull(title)
	}
}
或者,你可以配置用于 setter 注入的类,如
遵循:@Autowired
- 
Java
 - 
Kotlin
 
@ExtendWith(SpringExtension.class)
// specifies the Spring configuration to load for this test fixture
@ContextConfiguration("repository-config.xml")
class HibernateTitleRepositoryTests {
	// this instance will be dependency injected by type
	HibernateTitleRepository titleRepository;
	@Autowired
	void setTitleRepository(HibernateTitleRepository titleRepository) {
		this.titleRepository = titleRepository;
	}
	@Test
	void findById() {
		Title title = titleRepository.findById(new Long(10));
		assertNotNull(title);
	}
}
@ExtendWith(SpringExtension::class)
// specifies the Spring configuration to load for this test fixture
@ContextConfiguration("repository-config.xml")
class HibernateTitleRepositoryTests {
	// this instance will be dependency injected by type
	lateinit var titleRepository: HibernateTitleRepository
	@Autowired
	fun setTitleRepository(titleRepository: HibernateTitleRepository) {
		this.titleRepository = titleRepository
	}
	@Test
	fun findById() {
		val title = titleRepository.findById(10)
		assertNotNull(title)
	}
}
前面的代码清单使用注释引用的相同 XML 上下文文件(即 )。以下内容
显示了此配置:@ContextConfigurationrepository-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- this bean will be injected into the HibernateTitleRepositoryTests class -->
	<bean id="titleRepository" class="com.foo.repository.hibernate.HibernateTitleRepository">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
	<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<!-- configuration elided for brevity -->
	</bean>
</beans>
| 
 如果你从 Spring 提供的测试基类扩展,而该基类恰好在其 setter 方法之一上使用,则你可能有多个受影响的 bean
类型(例如,多个 bean)。在
在这种情况下,你可以重写 setter 方法并使用 Comments 来
指示一个特定的目标 Bean,如下所示(但请确保将 delegate 委托给被覆盖的
方法): 
 
指定的 qualifier 值指示要注入的特定 bean,
将类型匹配项集缩小到特定的 bean。它的值与相应定义中的声明匹配。bean 名称
用作回退限定符值,因此您还可以有效地指向特定的
bean 按名称排列(如前所述,假设这是 bean)。  | 
| 
 如果你从 Spring 提供的测试基类扩展,而该基类恰好在其 setter 方法之一上使用,则你可能有多个受影响的 bean
类型(例如,多个 bean)。在
在这种情况下,你可以重写 setter 方法并使用 Comments 来
指示一个特定的目标 Bean,如下所示(但请确保将 delegate 委托给被覆盖的
方法): 
 
指定的 qualifier 值指示要注入的特定 bean,
将类型匹配项集缩小到特定的 bean。它的值与相应定义中的声明匹配。bean 名称
用作回退限定符值,因此您还可以有效地指向特定的
bean 按名称排列(如前所述,假设这是 bean)。  |