How to use random port for JUNIT Testcases using Spring Boot 1.4.0 +

20,959

From Spring Blog I have updated your latest sample.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment=WebEnvironment.RANDOM_PORT)
public class CustomerControllerIT {
    @Autowired
    private TestRestTemplate template;

    @Autowired
    private DataBuilder dataBuilder;

    @Autowired
    private CustomerRepository customerRepository;

    private static final String JSON_CONTENT_TYPE = "application/json;charset=UTF-8"; 


    @Before
    public void setUp() throws Exception {
        /* remove and reload test data */
        customerRepository.deleteAll();     
        dataBuilder.createCustomers().forEach(customer -> customerRepository.save(customer));       
    }

    @Test
    public void getAllCustomers() throws Exception {
        ResponseEntity<String> response = template.getForEntity("/rest/customers", String.class);     
        assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

        List<Customer> customers = convertJsonToCustomers(response.getBody());      
        assertThat(customers.size(), equalTo(3));       
    }
}
Share:
20,959
rajadilipkolli
Author by

rajadilipkolli

JEE Developer, Microservices Ninja

Updated on February 15, 2020

Comments

  • rajadilipkolli
    rajadilipkolli over 4 years

    I am using spring boot 1.3.6 and my JUNIT Test cases are running fine, after upgrading to spring boot 1.4.0 and attempting to remove deprecated classes is throwing me error

    My JUNITCLASS with 1.3.x

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    @IntegrationTest({"server.port=0"})
    public class CustomerControllerIT {
    
        @Value("${local.server.port}")
        private int port;
        private URL base;
        private RestTemplate template;
    
        @Autowired
        private DataBuilder dataBuilder;
    
        @Autowired
        private CustomerRepository customerRepository;
    
        private static final String JSON_CONTENT_TYPE = "application/json;charset=UTF-8"; 
    
    
        @Before
        public void setUp() throws Exception {
            this.base = new URL("http://localhost:" + port + "/rest/customers");
            template = new TestRestTemplate();      
    
            /* remove and reload test data */
            customerRepository.deleteAll();     
            dataBuilder.createCustomers().forEach(customer -> customerRepository.save(customer));       
        }
    
        @Test
        public void getAllCustomers() throws Exception {
            ResponseEntity<String> response = template.getForEntity(base.toString(), String.class);     
            assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
    
            List<Customer> customers = convertJsonToCustomers(response.getBody());      
            assertThat(customers.size(), equalTo(3));       
        }
    
    private List<Customer> convertJsonToCustomers(String json) throws Exception        {        
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(json, TypeFactory.defaultInstance().constructCollectionType(List.class, Customer.class));
    }
    }
    

    MyClass with 1.4.0

    Updates done

    • Removed deprecated TestRestTemplate with spring suggested one
    • Running with SpringRunner instead of SpringJUnit4ClassRunner
    • Replaced @SpringApplicationConfiguration(classes = Application.class) with @SpringBootTest(classes = Application.class , webEnvironment=WebEnvironment.RANDOM_PORT)

    After Changes

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = Application.class , webEnvironment=WebEnvironment.RANDOM_PORT)
    @WebAppConfiguration
    public class CustomerControllerIT {
    
        @Value("${local.server.port}")
        private int port;
        private URL base;
        private TestRestTemplate template;
    
        @Autowired
        private DataBuilder dataBuilder;
    
        @Autowired
        private CustomerRepository customerRepository;
    
        private static final String JSON_CONTENT_TYPE = "application/json;charset=UTF-8"; 
    
    
        @Before
        public void setUp() throws Exception {
            this.base = new URL("http://localhost:" + port + "/rest/customers");
            template = new TestRestTemplate();      
    
            /* remove and reload test data */
            customerRepository.deleteAll();     
            dataBuilder.createCustomers().forEach(customer -> customerRepository.save(customer));       
        }
    }
    

    Now I am receiving NPE when i try to run JUNIT Testcase, How can I set the random port to make my JUNIT test case running in Spring Boot 1.4.0 +?

    Update :

    Here is the stacktrace of the issue

    java.lang.IllegalStateException: Failed to load ApplicationContext
        at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
        at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
        at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:189)
        at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:131)
        at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
    Caused by: java.lang.NullPointerException
        at org.springframework.test.context.web.socket.MockServerContainerContextCustomizer.customizeContext(MockServerContainerContextCustomizer.java:38)
        at org.springframework.boot.test.context.SpringBootContextLoader$ContextCustomizerAdapter.initialize(SpringBootContextLoader.java:270)
        at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:633)
        at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:347)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:311)
        at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:111)
        at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
        at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
        ... 25 more