Я готовлюсь к сертификации Spring Core и у меня есть некоторые сомнения, связанные с использованием профилей в тестах JUnit.
Итак, я знаю, что если я отмечу класс следующим образом:
@Profile("stub")
@Repository
public class StubAccountRepository implements AccountRepository {
private Logger logger = Logger.getLogger(StubAccountRepository.class);
private Map<String, Account> accountsByCreditCard = new HashMap<String, Account>();
/**
* Creates a single test account with two beneficiaries. Also logs creation
* so we know which repository we are using.
*/
public StubAccountRepository() {
logger.info("Creating " + getClass().getSimpleName());
Account account = new Account("123456789", "Keith and Keri Donald");
account.addBeneficiary("Annabelle", Percentage.valueOf("50%"));
account.addBeneficiary("Corgan", Percentage.valueOf("50%"));
accountsByCreditCard.put("1234123412341234", account);
}
public Account findByCreditCard(String creditCardNumber) {
Account account = accountsByCreditCard.get(creditCardNumber);
if (account == null) {
throw new EmptyResultDataAccessException(1);
}
return account;
}
public void updateBeneficiaries(Account account) {
// nothing to do, everything is in memory
}
}
Я объявляю сервисный компонент, принадлежащий профилю заглушки.
Итак, если мой тестовый класс выглядит примерно так:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=TestInfrastructureConfig.class)
@ActiveProfiles("stub")
public class RewardNetworkTests {
.....................................
.....................................
.....................................
}
это означает, что будут использоваться bean-компоненты, принадлежащие профилю stub, и bean-компоненты, не имеющие профиля. Это правильно или я что-то упускаю?
Что произойдет, если вместо этого использовать аннотацию @ActiveProfiles для класса (экземпляром которого будет Spring bean), я использую ее в Класс конфигурации Java?
Что-то вроде этого:
@Configuration
@Profile("jdbc-dev")
public class TestInfrastructureDevConfig {
/**
* Creates an in-memory "rewards" database populated
* with test data for fast testing
*/
@Bean
public DataSource dataSource(){
return
(new EmbeddedDatabaseBuilder())
.addScript("classpath:rewards/testdb/schema.sql")
.addScript("classpath:rewards/testdb/test-data.sql")
.build();
}
}
Что именно делать? Я думаю, что все бины, настроенные в этом классе, будут принадлежать профилю jdbc-dev, но я не уверен в этом. Можете ли вы дать мне больше информации об этой вещи?
Почему я должен использовать аннотацию @Profile в **классе конфигурации* вместо того, чтобы аннотировать непосредственно мои bean-компоненты?
Tnx