Can you make controller class mocked instead of other? Unit testing on a real DB isn't a good idea. Just use controller public methods like if you are using API. I had a unit test like that:
@ExtendWith(MockitoExtension.class)
class TestLaunch {
@Mock
private ReposMineserver mineservers;
@Mock
private ReposTariff tariffs;
@Mock
private ServiceMinecraftServerObserver observers;
@Mock
private ServiceHandlers handlers;
@InjectMocks
private RootController controller;
@Test
void launch_serverExists_shouldReturnOk() {
Config.PATH_TO_SERVERS = "test/";
Integer id = 2;
Mineserver mineserver = new Mineserver();
mineserver.setId(id);
mineserver.setIdTariff(id);
Tariff tariff = new Tariff();
tariff.setCpuThreads((short)2);
tariff.setHoursWorkMax(9999);
tariff.setMemoryLimit((long)9999);
tariff.setRam((short)4);
lenient().when(handlers.get(2)).thenReturn(new MinecraftHandler(mineserver, tariff));
lenient().when(mineservers.findById(id)).thenReturn(Optional.of(mineserver));
lenient().when(tariffs.findById(id)).thenReturn(Optional.of(tariff));
// Test data files (emit minecraft)
File file = new File("test/server_2");
file.mkdirs();
file = new File("test/server_2/run.sh");
System.out.println(file.getAbsolutePath());
if (!file.exists()) {
try {
file.createNewFile();
FileWriter f = new FileWriter(file);
f.append("while true; do echo 123; done");
f.close();
} catch (IOException e) {
e.printStackTrace();
}
}
file = new File("test/server_2/server.properties");
System.out.println(file.getAbsolutePath());
if (!file.exists()) {
try {
file.createNewFile();
FileWriter f = new FileWriter(file);
f.append("max-players=2\nserver-port=25565\nquery.port=25565");
f.close();
} catch (IOException e) {
e.printStackTrace();
}
}
ResponseEntity<Void> response = controller.launch(id);
assertEquals(HttpStatus.OK, response.getStatusCode());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String errOutput = errContent.toString();
System.out.println("Captured error output: " + errOutput);
assertEquals(true, controller.is_alive(id).getBody());
}
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
private final PrintStream originalErr = System.err;
@BeforeEach
public void setUp() {
System.setErr(new PrintStream(errContent));
}
@AfterEach
public void restoreStreams() {
System.setErr(originalErr);
}
}
Integration testing may be including http requests to a real server with database, but unit testing with a real db makes errors while "maven clean install". All your data in test must be independent from the enviroment