Как избежать BeanCreationException: Не удалось автоматически связать ошибку поля

1

У меня есть следующая конфигурация весеннего теста с различными профилями:

@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 install тесты работают, но если я должен был запустить его, щелкнув правой кнопкой мыши метод, он получит

Error creating bean with name 'uk.co.test.ws.service.base.SampleFTest': Injection of autowired dependencies failed;
  • 0
    "По правому клику" я думаю, в какой-то IDE? Если это так, вы должны проверить конфигурацию для этой задачи в вашей IDE.
  • 0
    Да, на затмении, извините, я забыл упомянуть. Щелкните правой кнопкой мыши и запустите «JUnit Test». Какую конфигурацию он должен иметь? Я добавил -Dspring.profile.active = local в аргументы vm, и он все еще не работает ..
Показать ещё 3 комментария
Теги:
spring
testing
junit
autowired

1 ответ

0
Лучший ответ

Вы забыли выбрать профиль в классе SampleFTest, вы должны добавить эту строку:

@ActiveProfiles(profiles = "local")

Таким образом, SpringTestConfigLocal будет инициализирован и доступен baseUrl

EDIT: я бы добавил свойство в файл .properties чтобы я мог использовать переменную myprofile:

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

И в конце концов, если вы не хотите время от времени менять значение, я бы применил некоторую логику, чтобы загрузить один файл свойств или другой.

EDIT 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]);
    }


}
  • 0
    Ого, это сработало, спасибо. Есть ли способ сделать так, чтобы он использовал профиль в pom.xml? Мне бы хотелось, чтобы я мог скомпилировать тест с определенным профилем, поэтому мне не придется постоянно менять эту строку.
  • 0
    Я не знаю, как использовать переменную из pom.xml, но я бы использовал файл свойств, как я написал в редактировании
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню