Spring Boot - Junit не может загрузить свойства конфигурации в тесте junit - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть consumer.properties файл со следующим содержимым в src/main/resources и сопровождающий класс Configuration, который загружает и сохраняет содержимое файла в переменные-члены класса:

// consumer.properties файл в src/main/resources:

com.training.consumer.hostname=myhost
com.training.consumer.username=myusername
com.training.consumer.password=mypassword

// ConsumerConfig.java

@Configuration
@PropertySource(
        value= {"classpath:consumer.properties"}
        )
@ConfigurationProperties(prefix="com.training.consumer")
public class ConsumerConfig {

    private String hostname;
    private String username;
    private String password;

    public ConsumerConfig() { }

    public String getHostname() {
        return hostname;
    }
    public void setHostname(String hostname) {
        this.hostname = hostname;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "ConsumerConfig [hostname=" + hostname + ", username=" + username + ", password=" + password + "]";
    }
}

У меня также есть класс ConfigsService, который автоматически связывает класс ConsumerConfig для извлечения отдельных свойств:

@Component
public class ConfigsService {

    @Autowired
    ConsumerConfig consumerConfig;

    public ConsumerConfig getConsumerConfig() {
        return consumerConfig;
    }

    public void showConfig() {
        consumerConfig.toString();
    }

    public ConsumerConfig getConfig() {
        return consumerConfig;
    }
}

Свойства загружаются просто отлично при запуске методов ConfigsService.Проблема в модульных тестах, где вызов configService.getConfig().getHostname() возвращает нулевое значение - даже после создания каталога src/test/resources и добавления в него моего файла consumer.properties:

@TestPropertySource("classpath:consumer.properties")
public class ConfigsServiceTest {

    @Mock
    ConsumerConfig consumerConfig;

    @InjectMocks
    ConfigsService configService;


    @Before
    public void beforeEach() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void someTest() {
        System.out.println(configService.getConfig().getHostname()); //outputs null here -- wth!
        Assert.assertTrue(true);
    }
}

1 Ответ

0 голосов
/ 24 ноября 2018

вы получаете нулевые значения из-за фиктивного объекта.Я предложу использовать Spring Runner с контекстной конфигурацией, которая загрузит свойства в классе config и создаст bean-компонент.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ConsumerConfig.class, ConfigsService.class})
@TestPropertySource(locations = "classpath:consumer.properties")
public class ConfigsServiceTest {

  @Autowired
  private ConfigsService configsService;

  @Test
  public void someTest() {
    Assert.assertNotNull(configService.getConfig().getHostname());
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...