【发布时间】:2018-12-02 02:51:09
【问题描述】:
在编写测试时,@Autowired 周围的规则/行为是否不同?似乎通过测试,您可以自动连接到具体类型,但如果您在 @Component 中尝试相同的事情,它将失败。这是一个人为的例子,但这是我遇到的,只是想更好地理解。
人为的示例代码:
public interface Gizmo {
void whirr();
}
@Configuration
public class GizmoConfiguration {
@Bean
@Profile("no-dependencies")
public Gizmo fooGizmoBean() {
return new FooGizmo();
}
@Bean
@Profile("!no-dependencies")
public Gizmo barGizmoBean() {
return new BarGizmo();
}
public class FooGizmo implements Gizmo {
@Override
public void whirr() {
}
}
public class BarGizmo implements Gizmo {
@Override
public void whirr() {
}
}
}
测试运行良好:
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(Application.Profiles.NO_DEPENDENCIES)
public class TestClass {
@Autowired
private GizmoConfiguration.FooGizmo gizmo;
@Test
public void test() {
assertNotNull(gizmo);
}
}
导致java.lang.IllegalStateException: Failed to load ApplicationContext的组件:
@Component
public class TestComponent {
@Autowired
private GizmoConfiguration.FooGizmo gizmo;
}
因为:
No qualifying bean of type 'GizmoConfiguration$FooGizmo' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
【问题讨论】:
标签: spring spring-test spring-ioc