79613499

Date: 2025-05-09 04:55:19
Score: 0.5
Natty:
Report link

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

Reasons:
  • Long answer (-1):
  • Has code block (-0.5):
  • Contains question mark (0.5):
  • Starts with a question (0.5): Can you
  • Low reputation (1):
Posted by: tankoman 228