Spring @Profile Annotation在测试中不起作用

时间:2014-05-02 03:28:54

标签: java spring maven spring-mvc

我有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

2 个答案:

答案 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删除RestIfsClientMockIfsClient

上的班级注释