2017-02-17 2 views
0

Мне нужно отключить автозагрузка базы данных на этапе тестирования, которая выполняется в сборке 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; 

} 

ответ

0

Вы развернув весь контекст приложения с @SpringBootTest(classes = ApplicationTest.class), несмотря на ваше ApplicationTest класса.

Изменить его на @SpringBootTest(classes = EnvelopeController.class). Вам не нужно выделение ApplicationTest в вашем тесте.

первопричины

@SpringBootTest(classes = ApplicationTest.class)scans the classpath, под которым находится ApplicationTest. Поскольку у вас есть соответствующий класс Application без exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class} на вашем пути к классам, Spring загружает базу данных и в этом случае.

улучшения тестов в Spring загрузки 1,4

Spring ботинке 1.4 introduced испытаний ломтиков и специальные аннотации для Mockito. Теперь вы можете упростить анализ до:

+0

Привет, Камилл, я пытаюсь реализовать ваши предложения.Пожалуйста, посмотрите, что я написал в моем вопросе. – Artegon

+0

@ user1315357 Пожалуйста, внимательно ознакомьтесь с моим примером. Вы забыли издеваться над вашими услугами с помощью '@ MockBean' –

+0

Извините, я не забыл, что это не работает с этими макетными бобами (я пытался много способов, чтобы он работал, поэтому я забыл упомянуть об этом). Пожалуйста, см. Мое последнее обновление № 2 с ошибкой, которая возникает, когда я использую эти макеты, которые вы предлагаете. – Artegon

Смежные вопросы