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 文件根目录的正确位置.
我想从 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 文件根目录的正确位置.