SpringBoot Основной метод тестирования Junit

У меня ниже тест для моего основного метода весенней загрузки.

Тест 2 раза пытается запустить приложение, что и ожидается.

Первый раз, когда он запускает приложение, он использует объект Mock, а второй раз запускает приложение, которое вызывает фактический bean.

У меня ReferenceDataService есть @PostConstract вызов метода, который вызывает вызов другого приложения, которое мне не нужно в моих тестах.

Другое дело, что MqConfiguration пытается подключиться к очередям IBM, чего я также хотел бы избежать в моем тесте.

Обратите внимание, хотя я добавил @ComponentScan(excludeFilters... в свой тестовый класс, это не исключает его.

Как мне в этом случае написать тест для моего основного метода?

@ActiveProfiles(profiles = {"test"})
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, properties = {
        "camel.springboot.java-routes-include-pattern=**/NONE*"})
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, SecurityAutoConfiguration.class})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = {MqConfiguration.class, ReferenceDataCache.class})})
public class MainApplicationTest {

    @MockBean
    private MqService mqService;

    @MockBean
    private ReferenceDataService referenceDataService;

    @SpyBean
    private ReferenceDataCache cacheSpy;

    @Test
    public void test() {
        Mockito.when(referenceDataService.getCurrencies()).thenReturn(new HashMap<>());
        Mockito.when(referenceDataService.getFrequencies()).thenReturn(null);
        Mockito.when(referenceDataService.getDayCountTypes()).thenReturn(null);
        Mockito.when(referenceDataService.getBusinessDayConverntions()).thenReturn(null);
        Mockito.when(referenceDataService.getRateDefinations()).thenReturn(null);
        Mockito.when(referenceDataService.getBusinessCalendar()).thenReturn(null);
        Mockito.when(referenceDataService.getFinancingTypes()).thenReturn(null);
        Mockito.when(referenceDataService.getStaffs()).thenReturn(null);
        MainApplication.main(new String[]{});
    }
}

MainApplication.java (тестируемый класс)

@SpringBootApplication
@EnableJms
@EnableCaching
@AutoConfigureBefore(JmsAutoConfiguration.class)
public class MainApplication {

    private static final Logger logger = LoggerFactory.getLogger(MainApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }

}

person Jigar Naik    schedule 19.07.2019    source источник
comment
Пожалуйста, опубликуйте весь свой код, а не только его части. И вы говорите, что ot должен запускаться два раза, но у вас есть один тест, который вызывает основной метод один раз.   -  person Toerktumlare    schedule 19.07.2019
comment
Один - когда я вызываю основной метод из своего теста, а другой - из-за аннотации @SpringBootTest(classes = MainApplication.class   -  person Jigar Naik    schedule 19.07.2019
comment
Можно было подумать о разделении теста. Как и в первом случае, вы можете сделать это для загрузки контекста приложения, а во вторую - для тестирования контекста вашего приложения. В качестве альтернативы, можно ли использовать PowerMockito для проверки статических методов?   -  person Sid    schedule 19.07.2019
comment
Разделите модульные тесты и тесты приложений.   -  person Toerktumlare    schedule 19.07.2019
comment
Не могли бы вы указать на какой-нибудь пример или дать какой-нибудь намек? Пишу юнит впервые.   -  person Jigar Naik    schedule 19.07.2019


Ответы (1)


Его можно разделить на две отдельные части тестирования, поскольку мы должны стремиться тестировать одну функциональность в каждом тесте (принцип единой ответственности). Вы можете смоделировать свое тестирование, как показано ниже:

 @Test
 public void applicationContextLoadedTest(){
 }

 @Test
 public void applicationStartTest() {
 //you can add your mocks as per your required dependencies and requirements
  MainApplication.main(new String[] {});
 }

В качестве альтернативы, если вам разрешено использовать PowerMockito, следующая ссылка дает вам рабочий пример для проверки статических вызовов. PowerMockito - тест SpringBoot

person Sid    schedule 19.07.2019