Application build needs external "resources" to work: is this bad or... normal?
I was talking with some coworkers about the application build and we have some divergences about what each one consider a good practice or something to worry about. I learn that a good application build is one that is self sufficient, no matter how many dependencies and tests it have, the build will take care about them and run the build smooth. Per example, if I have an application that uses Maven, I expect that a mvn clean install will work with the minimal requirements: Java, working Internet and maven installed (if you use mvnw in the project, even maven installed is optional). In this scenario, not matter if your build run unit or integration tests with MongoDB, Oauth2, RabbitMQ... it's the programmer job to mock/stub these dependencies for the tests run and the build be independent from external services/databases/queues/etc running. To be more clear, when I'm talking about integration tests, I'm talking about the the "narrow" ones: https://martinfowler.com/bliki/IntegrationTest.html, that typically run with the maven failsafe plugin in the Java world. But some coworkers don't see any problem if an application build depends of a started MongoDB, Oauth2 server, RabbitMQ and etc running on the developers machine only for the build. Even using docker to help, for me this is the wrong approach, because: The build is more slow. Add complexity in the build process. You need a Wiki/Guide only to explain how put the build to work. Consumes more memory, because the external dependencies are not mocked. You need to "reset" the external dependency each build. When we are talking about the System Tests (or the "broad" integration tests), yes, we need all this external dependencies up and running, but this kinds of tests not occur during the build. I think the resistant to make a self sufficient build cames from the complexity to deal with these dependencies on Integration Tests. Even using Spring, it's not easy to bypass a RabbitMQ and Oauth2 authentication, per example. Although is clear to me what is the right approach, I can't find any discussions on Internet about this subject. What you guys think?

I was talking with some coworkers about the application build and we have some divergences about what each one consider a good practice or something to worry about.
I learn that a good application build is one that is self sufficient, no matter how many dependencies and tests it have, the build will take care about them and run the build smooth.
Per example, if I have an application that uses Maven, I expect that a mvn clean install
will work with the minimal requirements: Java, working Internet and maven installed (if you use mvnw
in the project, even maven installed is optional).
In this scenario, not matter if your build run unit or integration tests with MongoDB, Oauth2, RabbitMQ... it's the programmer job to mock/stub these dependencies for the tests run and the build be independent from external services/databases/queues/etc running.
To be more clear, when I'm talking about integration tests, I'm talking about the the "narrow" ones: https://martinfowler.com/bliki/IntegrationTest.html, that typically run with the maven failsafe plugin in the Java world.
But some coworkers don't see any problem if an application build depends of a started MongoDB, Oauth2 server, RabbitMQ and etc running on the developers machine only for the build. Even using docker to help, for me this is the wrong approach, because:
- The build is more slow.
- Add complexity in the build process.
- You need a Wiki/Guide only to explain how put the build to work.
- Consumes more memory, because the external dependencies are not mocked.
- You need to "reset" the external dependency each build.
When we are talking about the System Tests (or the "broad" integration tests), yes, we need all this external dependencies up and running, but this kinds of tests not occur during the build.
I think the resistant to make a self sufficient build cames from the complexity to deal with these dependencies on Integration Tests. Even using Spring, it's not easy to bypass a RabbitMQ and Oauth2 authentication, per example.
Although is clear to me what is the right approach, I can't find any discussions on Internet about this subject. What you guys think?