Issue
I have a spring boot integration test. Currently it is running on the test through my test server app(MockServerApp.java) which is located in src/test/resources.
I want to also launch my spring boot app (App.java) before the integration tests are launched so it could connect and exercise soap calls that I will be adding to the integration test rather than manually running the main app server and then launching my integration test
My MockServerApp is configured to port 9119. My App(main app) is configured to port 28433. They are both running on localhost.
At first I tried running the two apps at the same time using SpringBootTest
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,classes = {App.class,MockServerApp.class
})
public class BillingMediatorIT {
@Test
public void testOne(){
}
}
But this only launches the mock server on port 9119.
I then tried launching it before integration tests like this
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,classes = {App.class,MockServerApp.class
})
public class BillingMediatorIT {
static ConfigurableApplicationContext context;
@BeforeClass
static public void setup(){
SpringApplication springApplication = new SpringApplicationBuilder()
.sources(App.class)
.build();
context = springApplication.run();
}
@Test
public void testOne(){
}
}
This gave me an error though saying that the address is already in use.
my test.properties
server.ssl.enabled=false
logging.config=classpath:logback-spring.xml
logging.file=messages
logging.file.max-size=50MB
logging.level.com.nulogix=DEBUG
billing.engine.address=127.0.0.1
billing.engine.port=9119
billing.engine.api.version=0.97
billing.engine.core.version=0.97
billing.engine.core.name=Patient_Responsibility
my app.properties
server.port=28433
server.ssl.enabled=true
server.ssl.key-store=/Users/asluborski/Documents/mock.jks
server.ssl.key-store-password=Nul0gix
logging.config=classpath:logback-spring.xml
logging.file=messages
logging.file.max-size=50MB
logging.level.com.nulogix=DEBUG
billing.engine.address=127.0.0.1
billing.engine.port=9119
billing.engine.api.version=0.97
billing.engine.core.version=0.97
billing.engine.core.name=Patient_Responsibility
So after playing around and changing the server.ports in both properties files, I've realized that the integration test is still running with my MockServerApp although my spring boot test is directing towards the main app class. I've tried using property source but it didn't work.
Something I should add is that both my properties in src/test/resources and src/main/resources are both named application.properties. I am not sure if this could be causing the conflict but I simply copied over the properties from main and then just changed the server.port inside the file. I am not sure how to change the name of the .properties.
Solution
Here are two suggestions that may help depending on your situation:
If all you need is a controller to communicate with, then just set up one in your test directory (i.e. same locations as your other tests) and write your tests talk to that controller. Your use of SpringRunner/SpringBootTest will turn on this controller as though it was part of your main application for the purposes of your tests. Just note that it will run on the same port as your main application, so just make sure it has different endpoints to avoid any collision.
If your Mocked Server is more complicated, configuration of your endpoints is an issue, or you feel like you may be adding multiple connections to services (think nginx server, database, messaging etc) to these test in the future, then I would suggest looking at Testcontainers. This allows you to use images in docker containers that you can connect to as resources in your integration tests.
Answered By - MochiJump