代码之家  ›  专栏  ›  技术社区  ›  obsessiveCookie

如何避免BeanCreationException:无法自动关联字段错误

  •  1
  • obsessiveCookie  · 技术社区  · 10 年前

    我有以下不同外形的弹簧测试配置:

    @Configuration
    @ComponentScan (value = {"uk.co.test.ws" })
    public class SpringTestConfig
    {
    
    
        @Profile( "local")
        @PropertySource( "classpath:/config/local/settings.properties" )
        public static class SpringTestConfigLocal
        {
            @Autowired
            private Environment environment ;  
    
            @Bean(name= "baseUrl" )
            public String setBaseUrl()
            {
                return environment .getRequiredProperty("baseurl.protocol" )+"://" +environment .getRequiredProperty( "baseurl.host");             
            }
        }
    

    然后创建一个基类,该基类接受基url

    > @RunWith (SpringJUnit4ClassRunner. class) @ContextConfiguration
    > (classes = { SpringTestConfig. class }) public class BaseWsTest {
    >     @Autowired
    >     String baseUrl;
    

    然后扩展到其他测试类,如下所示:

    public class SampleFTest extends BaseWsTest
    {
        @Test
        public void hello() throws FileNotFoundException, Exception
        {
            System. out .println("base url: " + baseUrl );
    

    当使用普通maven clean安装运行时,测试可以运行,但如果我要通过右键单击该方法来运行它,它会得到一个

    Error creating bean with name 'uk.co.test.ws.service.base.SampleFTest': Injection of autowired dependencies failed;
    
    1 回复  |  直到 10 年前
        1
  •  0
  •   Community CDub    5 年前

    您忘记在您的 SampleFTest 类,您应该添加此行:

    @ActiveProfiles(profiles = "local")
    

    这样 SpringTestConfigLocal 将被初始化 baseUrl 可用的bean

    编辑 :我将在 .properties 文件,以便我可以使用变量myprofile:

    @ActiveProfiles(profiles = "${myprofile}")

    最后,如果您不想不时更改值,我会应用一些逻辑来加载一个或另一个属性文件。

    编辑2 :很抱歉,这不起作用,因为文件是在分配注释EL值后加载的,但您可以添加以下内容:

    spring.profiles.active=local
    

    添加到属性文件,这将与放置注释相同 @IntegrationTest("local") 。这是我尝试的代码:

    @TestPropertySource(value="classpath:/config/test.properties")//, properties={"myaddress=cane", "myprofile=local"})
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    @IntegrationTest("${myaddress}")
    //@ContextConfiguration
    //@ActiveProfiles(profiles = "${myprofile}")
    public class BasicJUnitTest{
    
        protected Logger logger;
    
        protected MockMvc mockMvc;
    
        @Autowired
        private Environment env;
    
        
        @Value("${myaddress}" )
        String myval;
        
        
        public BasicJUnitTest(){
            this.logger = LoggerFactory.getLogger(this.getClass());
        }
            
        @Test
        public void test(){
            logger.info("hola"+myval+ " " + env.getActiveProfiles()[0]);
        }
        
    
    }