Jigar Naik
Jigar Naik

Reputation: 1994

SpringBoot Junit testing main method

I have below test for my spring boot main method.

The test tries to start the application 2 times which is expected.

First time when it starts the application it uses the Mock object hewever 2nd time it starts the application it calls the actual bean.

I have ReferenceDataService having @PostConstract method call which makes rest call to some other application which I don't want in my tests.

Another thing is that MqConfiguration which tries to connect to IBM queues that also I would like to avoid in my test.

Please note even though I have added @ComponentScan(excludeFilters... in my test class it does not exclude it.

How do I write test for my main method in this case?

@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 (The class to be tested)

@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);
    }

}

Upvotes: 2

Views: 8953

Answers (1)

Sid
Sid

Reputation: 349

One could split it into two separate testing parts as we should strive to test a single functionality per test (Single Responsibility Principle). You could model your testing like below:

 @Test
 public void applicationContextLoadedTest(){
 }

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

Alternatively, if you are allowed to use PowerMockito, then the following link gives you a working example for verifying static invocations.PowerMockito - SpringBoot test

Upvotes: 3

Related Questions