• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java - testy jednostkowe

42 Warsaw Coding Academy
0 głosów
294 wizyt
pytanie zadane 22 sierpnia 2021 w Java przez Bartek030 Obywatel (1,460 p.)

Witam,

Chciałem prosić o poradę przy pisaniu testów jednostkowych. Niedawno stworzyłem mały projekt do wyświetlania prognozy pogody przy użyciu JavyFX - kod można znaleźć TUTAJ

Teraz chciałbym napisać do tej aplikacji testy jednostkowe natomiast mam problem z określeniem zakresu, jaki te testy powinny obejmować. Jestem świadom, że testy powinny obejmować tylko kod, stworzony przeze mnie, oraz że nie ma sensu pisać testów dla prostych getterów i setterów. Natomiast mam dylemat co do pozostałej części.

Pierwszy przykład:

public class Geolocation {

    private final InputStream databasePath = getClass().getResourceAsStream(Config.GEOLOCATION_DATABASE_PATH);

    public  String getCityName() throws IOException, GeoIp2Exception {
        String ipAddress = getIpAddress();
        File database = streamToFile(databasePath);
        DatabaseReader databaseReader = new DatabaseReader.Builder(database).build();
        InetAddress inetAddress = InetAddress.getByName(ipAddress);
        CityResponse cityResponse = databaseReader.city(inetAddress);
        return cityResponse.getCity().getName();
    }

    private String getIpAddress() throws IOException {
        URL url = new URL(Config.CHECK_IP_URL_PATH);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream()));
        return bufferedReader.readLine();
    }

    private static File streamToFile(InputStream in) throws IOException {
        File tempFile = File.createTempFile(Config.GEOLOCATION_DATABASE_TEMP_FILE_PREFIX, Config.GEOLOCATION_DATABASE_TEMP_FILE_SUFFIX);
        tempFile.deleteOnExit();
        FileOutputStream out = new FileOutputStream(tempFile);
        in.transferTo(out);
        return tempFile;
    }
}

To jest klasa, której metody mają za zadanie zwrócić aktualną lokalizację użytkownika. Wszystkie metody są stworzone przeze mnie więc teoretycznie powinienem je przetestować, ale na przykład metoda getIpAddress będzie zwracała inną wartość dla różnych użytkowników a przepisywanie tej metody do testu wydaje się bez sensu. Czy w takim razie powinienem pominąć test tej metody? Druga sprawa to metoda getCityName, której zwracana wartość jest zależna właśnie od adresu IP. Tutaj teoretycznie mogę rozszerzyć tę klasę i nadpisać tą metodę dla testu tak aby do zmiennej ipAddress przypisać przypisać stałą wartość. I tutaj mogę sprawdzić czy poprawnie wyciągam nazwę z bazy danych, ale wydaje mi się to zbyt prymitywne podejście. Może ktoś mógłby polecić lepszy pomysł.

Drugi przykład:

public class CurrentWeatherController extends BaseController implements Initializable {

    private final CurrentWeatherData currentWeatherData;

    @FXML
    private Label cityNameLabel;

    @FXML
    private ImageView currentWeatherImage;

    @FXML
    private Label currentWeatherTemperature;

    @FXML
    private Label currentWeatherDescription;

    @FXML
    private Label currentWindLabel;

    @FXML
    private ImageView currentWindImage;

    @FXML
    private Label currentWeatherPressure;

    @FXML
    private Label currentWeatherHumidity;

    public CurrentWeatherController(ViewFactory viewFactory, String fxmlName, CurrentWeatherData currentWeatherData) {
        super(viewFactory, fxmlName);
        this.currentWeatherData = currentWeatherData;
    }

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        setCityNameLabel();
        setCurrentWeatherImage();
        setCurrentWeatherTemperatureLabel();
        setCurrentWeatherDescriptionLabel();
        setCurrentWindLabel();
        setCurrentWindImage();
        setCurrentWeatherPressureLabel();
        setCurrentWeatherHumidityLabel();
    }

    private void setCityNameLabel() {
        String cityName = currentWeatherData.getName().toUpperCase();
        cityNameLabel.setText(cityName);
    }

    private void setCurrentWeatherImage() {
        Image image = ImageResolver.getWeatherIcon(currentWeatherData.getWeather().get(0).getIcon());
        currentWeatherImage.setImage(image);
    }

    private void setCurrentWeatherTemperatureLabel() {
        String temperature = currentWeatherData.getMain().getTemp() + LabelsDescription.TEMPERATURE_UNIT;
        currentWeatherTemperature.setText(temperature);
    }

    private void setCurrentWeatherDescriptionLabel() {
        String description = StringMethods.capitalizeFirstLetter(currentWeatherData.getWeather().get(0).getDescription());
        currentWeatherDescription.setText(description);
    }

    private void setCurrentWindLabel() {
        String windLabel = LabelsDescription.WIND_LABEL + currentWeatherData.getWind().getSpeed() + LabelsDescription.WIND_UNIT;
        currentWindLabel.setText(windLabel);
    }

    private void setCurrentWindImage() {
        URL url = getClass().getResource(ImageResolver.ARROW_IMAGE_PATH);
        Image image = new Image(String.valueOf(url));
        int windDeg = currentWeatherData.getWind().getDeg();

        currentWindImage.setImage(image);
        currentWindImage.setRotate(windDeg);
    }

    private void setCurrentWeatherPressureLabel() {
        String pressureLabel = LabelsDescription.PRESSURE_LABEL + currentWeatherData.getMain().getPressure() + LabelsDescription.PRESSURE_UNIT;
        currentWeatherPressure.setText(pressureLabel);
    }

    private void setCurrentWeatherHumidityLabel() {
        String humidityLabel = LabelsDescription.HUMIDITY_LABEL + currentWeatherData.getMain().getHumidity() + LabelsDescription.HUMIDITY_UNIT;
        currentWeatherHumidity.setText(humidityLabel);
    }
}

To klasa (kontroler), która odpowiada za ustawianie wartości na widoku aplikacji. Większość metod to zwykłe settery dla kontrolek, które dodatkowo wyciągają odpowiednią informację do wyświetlenia. I tutaj mam dylemat czy jest sens pisania testów dla takich metod jeśli mam inny test, który sprawdza czy do obiektu currentWeatherData zostają przypisane właściwe dane z przykładowego pliku json.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 509 wizyt
pytanie zadane 4 maja 2021 w Java przez janyczek Początkujący (360 p.)
0 głosów
2 odpowiedzi 1,018 wizyt
pytanie zadane 12 lipca 2018 w Java przez BuxBleed Użytkownik (810 p.)
0 głosów
2 odpowiedzi 1,012 wizyt
pytanie zadane 29 lutego 2020 w Java przez StressedOut Nowicjusz (210 p.)

93,382 zapytań

142,382 odpowiedzi

322,540 komentarzy

62,738 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...