我已经为设置了环境变量
<configuration>
<systemPropertyVariables>
<spring.active.profiles>development</spring.active.profiles>
</systemPropertyVariables>
</configuration>
然后我有两个配置文件类
@Profile("development")
public class MockIfsClient implements IFSClient {
@Nonnull
@Override
public String getPayload() {
return "MockIFS";
}
}
和
@Configuration
@Profile("production")
public class RestIfsClient implements IFSClient {
@Nonnull
@Override
public String getPayload() {
return "REST IFS Client";
}
}
和一名经理
public class IFSManager {
private IFSClient ifsClient;
@Autowired
public IFSManager(@Nonnull final IFSClient ifsClient) {
this.ifsClient = ifsClient;
System.out.println(ifsClient.getPayload());
}
}
当我尝试测试它并看到注入的bean是MockIFSClient
时,它失败了
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {IFSManager.class, MockIfsClient.class, RestIfsClient.class},loader=AnnotationConfigContextLoader.class)
public class IFSManagerTest {
@Autowired
private IFSManager ifsManager;
@Test
public void testMockIfsClient() throws Exception {
System.out.println(System.getProperty("spring.active.profiles"));
assertTrue(true);
}
}
我看到的错误是
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.yahoo.pryme_services.external_services.ifs.IFSClient] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Nonnull(when=ALWAYS)}
我是春季的新手,不确定我做错了什么
更新
如果我删除@Profile
注释,则失败
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { IFSManager.class, RestIfsClient.class, MockIfsClient.class }, loader = AnnotationConfigContextLoader.class)
public class IFSManagerTest {
@Autowired
private IFSManager ifsManager;
@Test
public void testMockIfsClient() throws Exception {
System.out.println("Active Profile: " + System.getProperty("spring.active.profiles"));
assertTrue(true);
}
}
错误
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.hoo.pryme_services.external_services.ifs.IFSClient] is defined: expected single matching bean but found 2: restIfsClient,mockIfsClient
尝试将spring.profiles.active
作为属性名称。
尝试执行以下操作:
@ComponentScan("your.base.package")
@Configuration
public class Configuration {
@Profile("development")
public IFSClient mockIfsClient() {
return new MockIfsClient();
}
@Profile("production")
public IFSClient restIfsClient() {
return new RestIfsClient();
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Configuration.class)
@ActiveProfile("development")
public class IFSManagerTest {
}
Aslo删除RestIfsClient
和MockIfsClient
上的类注释