JavaFx MediaPlayer ведет себя по-разному в модульном тестировании по сравнению с приложением, почему? - PullRequest
0 голосов
/ 10 октября 2019

Я хочу загрузить метаданные из файла MP3, который будет воспроизводиться проигрывателем JavaFx MediaPlayer. Это прекрасно работает в модульном тесте, но не в приложении. В модульном тесте сообщалось о 6 элементах метаданных, но в приложении - ноль. Метод, который "делает работу", тот же.

Основной класс приложения расширяет приложение. Тестовый класс расширяет ApplicationTest от TestFx. Может ли это повлиять на поведение?

Приложение:

public class MediaMain extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        Map<String, Object> meta = metaData();

        System.out.printf("Number of meta data: %d.%n", meta.size());
        System.out.println(meta);
    }

    Map<String, Object> metaData() {
        File audioFile = new File("src/main/resources", "beingBoiled.mp3");
        final URI uri = audioFile.toURI();
        final String source = uri.toString();
        Media media = new Media(source);
        new MediaPlayer(media);
        return media.getMetadata();
    }
}

Модульный тест:

class MediaMainTest extends ApplicationTest {

    @Test
    void testMeta() {
        MediaMain main = new MediaMain();

        Map<String, Object> metaData = main.metaData();

        assertNotEquals(0, metaData.size());
        System.out.printf("Number of meta data: %d.%n", metaData.size());
        System.out.println(metaData);
    }
}

Распечатка из приложения:

Number of meta data: 0.
{}

Распечатка из модульного теста:

Number of meta data: 6.
{year=1980, artist=The Human League, raw metadata={ID3=java.nio.HeapByteBufferR[pos=254 lim=3214 cap=3214]}, album=Travelogue, genre=(52), title=Being Boiled}

В чем может быть причина? Это для меня загадка. Написан на Java 11, JavaFx 11.0.2 и TestFx 4.0.15-alpha.

1 Ответ

0 голосов
/ 10 октября 2019

Вы ссылаетесь на файл с местоположением src/main/resources, это, вероятно, не очень хорошая идея, поскольку у вашего развернутого приложения скорее всего не будет каталога src/main/resources, плюс ресурс может быть связан внутри jar приложения, а некак файл на диске, поэтому использование файлового протокола для доступа к нему не будет работать.

Вероятно, лучше использовать что-то вроде ниже:

String mediaLoc = getClass().getResource("/beingBoiled.mp3").toExternalForm()
Media media = new Media(mediaLoc)

Как в Как загрузить файл CSS в javafx8 . Точное местоположение загружаемого ресурса может отличаться в зависимости от сборки и структуры проекта. Если вы не хотите загружать из пути к классам, а вместо этого через файл или через HTTP-вызов по сети, тогда вам нужно будет использовать что-то еще.

Приведенный выше код предполагает, что ваша система сборки настроена на копирование носителя из src/main/resources в целевое местоположение упаковки и упаковку ресурса в распространяемый файл приложения (например, файл jar приложения) в корнефляга

Убедитесь, что ваша система сборки действительно копирует файл в целевое местоположение. Вы можете проверить, есть ли он там, запустив вашу сборку, посмотрев на получившийся jar и запустив jar tvf <myjarfilename>.jar, чтобы убедиться, что ресурс mp3 находится в правильном месте в корне файла jar.

...