JavaFx MediaPlayer 在单元测试和应用程序中的行为不同,为什么?

JavaFx MediaPlayer behaves differently in unit test vs application, why?

我想从 MP3 文件加载元数据,由 JavaFx MediaPlayer 播放。这在单元测试中工作正常,但在应用程序中却不行。在单元测试中,报告了 6 项元数据,但在应用程序中为零。 "does the work"的方法同上。

应用程序的主要 class 扩展了 Application。测试 class 从 TestFx 扩展了 ApplicationTest。这会影响行为吗?

应用程序:

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 编写。

您正在引用一个位置为 src/main/resources 的文件,这可能不是一个好主意,因为您部署的应用程序可能没有 src/main/resources 目录,而且资源可能被捆绑在应用程序 jar 中而不是作为磁盘上的文件,因此使用文件协议访问它是行不通的。

最好使用如下内容:

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

喜欢How load css file in javafx8。要加载的资源的确切位置可能因构建和项目结构而异。如果您不想从 class 路径加载,而是通过文件或网络 http 调用加载,那么您需要使用其他方法。

以上代码假定您的构建系统已设置为将媒体从 src/main/resources 复制到您的目标打包位置,并将资源打包到根目录中的可分发应用程序(例如应用程序 jar 文件)中jar 文件。

确保您的构建系统确实将文件复制到目标位置。您可以通过 运行 您的构建检查它是否存在,查看生成的 jar 和 运行 jar tvf <myjarfilename>.jar 以查看 mp3 资源是否位于 jar 文件根目录的正确位置.