Мне нужно отключить автозагрузка базы данных на этапе тестирования, которая выполняется в сборке TeamCity.Отключить автоматическую конфигурацию DB для сборки в TeamCity весной загрузки
I red many Q/A здесь, в SO, но никто из них не работает для меня. Я (думаю) отключил все автоматические настройки.
Это мой тестовый класс, который не работает с базой данных (уровень сервиса издевался):
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestContext.class, WebAppContext.class})
@SpringBootTest(classes = ApplicationTest.class)
public class EnvelopeControllerTest {
}
и TestContext.class
:
@Configuration
@ComponentScan("com.example")
@EnableWebMvc
@Profile("test")
public class TestContext {
@Bean
public EnvelopeService envelopeService() {
return Mockito.mock(EnvelopeService.class);
}
@Bean
public UtilService utilService() {
return Mockito.mock(UtilService.class);
}
}
и ApplicationTest.class
класс
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@ActiveProfiles("test")
public class ApplicationTest extends SpringBootServletInitializer {
private static Logger LOG = LogManager.getLogger(ApplicationTest.class);
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ApplicationTest.class);
}
public static void main(String[] args) throws Exception {
SpringApplication application = new SpringApplication(ApplicationTest.class);
application.setBannerMode(Banner.Mode.OFF);
application.run(args);
}
}
и создал пустой файл application-test.properties
, который не содержит информации f или подключение к БД, поэтому автоматическая настройка IMHO не должна обрабатываться.
Но когда я запускаю сборку в приложении TeamCity, все еще пытаются подключиться к базе данных.
Что я делаю неправильно?
Update # 1 относительно ответа KAMILL Сокола.
Я не в состоянии реализовать свои предложения, теперь я минимизирован класс контроллера следующим образом:
@RunWith(SpringRunner.class)
@WebMvcTest(EnvelopeController.class)
public class EnvelopeControllerTest {
@Test
public void failingTest() {
fail("Something goes wrong");
}
}
но теперь тест не может работать, потому что EnvelopeController
не может быть реализована - нет зависимости боба доступно. В моем решении у меня был TestContext
, который инициализировал эти бобы. Как решить это с помощью того, что вы предлагаете?
Вызванный: org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка при создании компонент с именем 'envelopeController': Неудовлетворенный зависимость выражается через метод параметра 'setUtilService' 0; вложенного исключения org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет квалификационных рожкового типа «» com.example.api.services.UtilService доступного: ожидаются, по крайней мере, 1 боб, который квалифицируется как autowire кандидата. Зависимость от аннотаций: {}
После я смогу запустить тестовый класс, мне нужно реализовать такой тест:
@Test
public void findById() throws Exception {
final String uuidString = "6c2b1c8a-3c29-4160-98b0-b8eaea7ea4d1";
final UUID id = UUID.fromString(uuidString);
final Envelope envelope = createEnvelope(id);
when(envelopeService.findOne(id, currentUser)).thenReturn(Optional.of(envelope));
when(utilService.getLoggedInUser()).thenReturn(currentUser);
mockMvc.perform(get("/api/envelopes/{id}", uuidString))
.andExpect(status().isOk())
.andExpect(content().contentType(Util.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$..id").value(uuidString));
verify(envelopeService, times(1)).findOne(id, currentUser);
}
Будет ли она работать с вашим решением?
Update # 2
Эта ошибка происходит, когда я включаю все издевались бобы из вашего примера:
Вызванные: org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания компонента с именем «envelopeController»: неудовлетворительно зависимость, выраженная через параметр «setEnvelopeRepository» метода 0; вложенное исключение org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем «envelopeRepository»: Невозможно создать внутренний компонент «(внутренняя фасоль) # 1229a2b7» типа [org.springframework.orm.jpa.SharedEntityManagerCreator ] при установке bean property 'entityManager'; вложенное исключение: org.springframework.beans.factory.BeanCreationException: ошибка создание bean-компонента с именем '(внутренний компонент) # 1229a2b7': не удается разрешить ссылку на bean 'entityManagerFactory' при установке конструктора аргумент; вложенное исключение не является org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет боба под названием «EntityManagerFactory» доступны
После некоторых играть с ним, кажется, что мне нужно @MockBean
всех бобы, которые необходимы для все другой фасоли используется этим контроллером, правда? Это не удобно. Когда у меня был класс TestContext
, у меня есть макеты в этом контексте, и мне не нужно было создавать вручную для всех классов контрольных контроллеров. Спасибо за помощь.
Update # 3 - EnvelopeController
зависимости класса:
@RestController
@RequestMapping(APIController.API_ROOT + "/envelopes")
public class EnvelopeController extends APIController {
private EnvelopeService envelopeService;
private DateService dateService;
@Autowired
public void setEnvelopeService(EnvelopeService envelopeService) {
Assert.notNull(envelopeService);
this.envelopeService = envelopeService;
}
@Autowired
public void setDateService(DateService dateService) {
Assert.notNull(dateService);
this.dateService = dateService;
}
// REST API endpoints are omitted
}
и класс EnvelopeService:
public class DefaultEnvelopeService implements EnvelopeService {
private EnvelopeRepository envelopeRepository;
private BalanceService balanceService;
private ScheduleService scheduleService;
}
Привет, Камилл, я пытаюсь реализовать ваши предложения.Пожалуйста, посмотрите, что я написал в моем вопросе. – Artegon
@ user1315357 Пожалуйста, внимательно ознакомьтесь с моим примером. Вы забыли издеваться над вашими услугами с помощью '@ MockBean' –
Извините, я не забыл, что это не работает с этими макетными бобами (я пытался много способов, чтобы он работал, поэтому я забыл упомянуть об этом). Пожалуйста, см. Мое последнее обновление № 2 с ошибкой, которая возникает, когда я использую эти макеты, которые вы предлагаете. – Artegon