This version is still in development and is not considered stable yet. For the latest stable version, please use Spring Framework 6.1.9!

@TestBean

@TestBean is used on a field in a test class to override a specific bean in the test’s ApplicationContext with an instance provided by a factory method.

The associated factory method name is derived from the annotated field’s name, or the bean name if specified. The factory method must be static, accept no arguments, and have a return type compatible with the type of the bean to override. To make things more explicit, or if you’d rather use a different name, the annotation allows for a specific method name to be provided.

By default, the annotated field’s type is used to search for candidate bean definitions to override. If multiple candidates match, @Qualifier can be provided to narrow the candidate to override. Alternatively, a candidate whose bean definition name matches the name of the field will match.

To use a by-name override rather than a by-type override, specify the name attribute of the annotation.

Qualifiers, including the name of the field, are used to determine if a separate ApplicationContext needs to be created. If you are using this feature to override the same bean in several tests, make sure to name the field consistently to avoid creating unnecessary contexts.

The following example shows how to use the default behavior of the @TestBean annotation:

  • Java

class OverrideBeanTests {
	@TestBean (1)
	private CustomService customService;

	// test case body...

	private static CustomService customService() { (2)
		return new MyFakeCustomService();
	}
}
1 Mark a field for overriding the bean with type CustomService.
2 The result of this static method will be used as the instance and injected into the field.

In the example above, we are overriding the bean with type CustomService. If more than one bean of that type exists, the bean named customService is considered. Otherwise, the test will fail, and you will need to provide a qualifier of some sort to identify which of the CustomService beans you want to override.

The following example uses a by-name lookup, rather than a by-type lookup:

  • Java

class OverrideBeanTests {
	@TestBean(name = "service", methodName = "createCustomService") (1)
	private CustomService customService;

	// test case body...

	private static CustomService createCustomService() { (2)
		return new MyFakeCustomService();
	}
}
1 Mark a field for overriding the bean with name service, and specify that the factory method is named createCustomService.
2 The result of this static method will be used as the instance and injected into the field.
Spring searches for the factory method to invoke in the test class, in the test class hierarchy, and in the enclosing class hierarchy for a @Nested test class.