我有maven为我设置环境变量
<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)}
我是Spring的新手,不知道我在做什么错误
更新
如果我删除@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
答案 0 :(得分:3)
尝试使用spring.profiles.active
作为您的媒体资源名称。
答案 1 :(得分:2)
尝试执行以下操作:
@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