Missing Bean Detection
A class marked with @Component may still be unavailable during autowiring if the Spring context does not scan its package. Consider the following class:
@Component
public class Calculator {
public int add() {
return 42;
}
}
Attempting to inject it in a test without proper container configuration will result in a NoSuchBeanDefinitionException:
@RunWith(SpringJUnit4ClassRunner.class)
public class CalculatorTest {
@Autowired
private Calculator calculator;
@Test
public void verifyAddition() {
Assert.assertEquals(42, calculator.add());
}
}
Spring must be told how to discover and register beans. There are three common approaches.
Programmatic Registration
Using @Configuration and Component Scanning
Create a configuration class that instructs Spring where to look for annotated components:
@Configuration
@ComponentScan(basePackages = "com.application.service")
public class AppConfig {
}
The @ComponentScan directive triggers classpath scanning within the specified package, picking up every stereotype-annotated class.
To use it in a test, reference the configuration class:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class CalculatorTest {
@Autowired
private Calculator calculator;
@Test
public void verifyAddition() {
Assert.assertEquals(42, calculator.add());
}
}
Explicit Bean Definition with @Bean
Instead of scanning, declare beans individually inside a @Configuration class:
@Configuration
public class AppConfig {
@Bean
public Calculator calculatorInstance() {
return new Calculator();
}
}
Each @Bean method’s return value is registered as a Spring-managed singleton. This approach avoids classpath scanning entirely and offers precise control over bean instantiation.
XML-Based Wiring
Beans can also be declared in an XML descriptor. Create a configuration file such as context-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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.application.service" />
</beans>
Load this XML resource during test execution:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/context-config.xml")
public class CalculatorTest {
@Autowired
private Calculator calculator;
@Test
public void verifyAddition() {
Assert.assertEquals(42, calculator.add());
}
}
When the <context:component-scan /> element is present, Spring processes the targeted package identically to the annotation-based scanner. Alternatively, individual <bean> elements can be used for explciit definitions without scanning.