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



我已经为设置了环境变量

               <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删除RestIfsClientMockIfsClient 上的类注释

最新更新