JavaFX与Junit

JavaFX与Junit,java,unit-testing,javafx,junit,Java,Unit Testing,Javafx,Junit,我想测试具有JavaFX场景元素的方法,比如TextField或DatePicker。我在这里找到了如何为JavaFX应用程序运行测试,如果我只有一个初始化线程的测试类,它对我来说很好。但是如果我有两门课呢?我无法使用launch方法初始化同一线程,因为将引发异常。若我不在第二个测试类中创建线程,那个么还有另一个异常。下面可以找到测试类和堆栈跟踪。我还想用@AfterClass注释在方法中停止这个线程,然后在第二个类中再次启动它,但我认为这是不可能的。有人能帮我吗 头等舱 @RunWith(Po

我想测试具有JavaFX场景元素的方法,比如TextField或DatePicker。我在这里找到了如何为JavaFX应用程序运行测试,如果我只有一个初始化线程的测试类,它对我来说很好。但是如果我有两门课呢?我无法使用launch方法初始化同一线程,因为将引发异常。若我不在第二个测试类中创建线程,那个么还有另一个异常。下面可以找到测试类和堆栈跟踪。我还想用@AfterClass注释在方法中停止这个线程,然后在第二个类中再次启动它,但我认为这是不可能的。有人能帮我吗

头等舱

@RunWith(PowerMockRunner.class)
@PrepareForTest({TextField.class, DatePicker.class})
public class FirstTestClass {

    @BeforeClass
    public static void javaFXInitializer() throws SQLException, InterruptedException {
        Thread thread = new Thread("JavaFX Init Thread") {
            public void run() {
                Application.launch(Main.class);
            }
        };
        thread.setDaemon(true);
        thread.start();
        Thread.sleep(5000);
    }

    @Test
    public void firstTest() {
        TextField textFieldMock = mock(TextField.class);
        DatePicker datePickerMock = mock(DatePicker.class);
        TestClass objectUnderTest = new TestClass();

        when(textFieldMock.getText()).thenReturn("2000");
        when(datePickerMock.getValue()).thenReturn(LocalDate.of(1992,1,1));

        //rest of code to test
    }

}
第二类

@RunWith(PowerMockRunner.class)
    @PrepareForTest({TextField.class, DatePicker.class})
    public class SecondTestClass {

        @BeforeClass
        public static void javaFXInitializer() throws SQLException, InterruptedException {
            Thread thread = new Thread("JavaFX Init Thread") {
                public void run() {
                    Application.launch(Main.class);
                }
            };
            thread.setDaemon(true);
            thread.start();
            Thread.sleep(5000);
        }

        @Test
        public void firstTest() {
            TextField textFieldMock = mock(TextField.class);
            DatePicker datePickerMock = mock(DatePicker.class);
            TestClass objectUnderTest = new TestClass();

            when(textFieldMock.getText()).thenReturn("5000");
            when(datePickerMock.getValue()).thenReturn(LocalDate.of(1990,1,1));

            //rest of code to test
        }

    }
在两个类中初始化线程时出现异常

Exception in thread "JavaFX IncomeTest Init Thread" java.lang.RuntimeException: java.lang.UnsatisfiedLinkError: Native Library C:\Program Files\Java\jdk1.8.0_144\jre\bin\glass.dll already loaded in another classloader
        at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:267)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:211)
        at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:675)
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:695)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.UnsatisfiedLinkError: Native Library C:\Program Files\Java\jdk1.8.0_144\jre\bin\glass.dll already loaded in another classloader
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1907)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
        at java.lang.Runtime.load0(Runtime.java:809)
        at java.lang.System.load(System.java:1086)
        at com.sun.glass.utils.NativeLibLoader.loadLibraryFullPath(NativeLibLoader.java:201)
        at com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:94)
        at com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:39)
        at com.sun.glass.ui.Application.loadNativeLibrary(Application.java:112)
        at com.sun.glass.ui.Application.loadNativeLibrary(Application.java:120)
        at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
        at com.sun.glass.ui.win.WinApplication$1.run(WinApplication.java:118)
        at com.sun.glass.ui.win.WinApplication$1.run(WinApplication.java:91)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.glass.ui.win.WinApplication.<clinit>(WinApplication.java:91)
        at com.sun.glass.ui.win.WinPlatformFactory.createApplication(WinPlatformFactory.java:39)
        at com.sun.glass.ui.win.WinPlatformFactory.createApplication(WinPlatformFactory.java:36)
        at com.sun.glass.ui.Application.run(Application.java:146)
        at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:257)
        ... 5 more
线程“JavaFX IncomeTest Init thread”java.lang.RuntimeException:java.lang.unsatifiedLinkError:Native Library C:\Program Files\java\jdk1.8.0\u 144\jre\bin\glass.dll中的异常已加载到另一个类加载器中 位于com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:267) 位于com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:211) 在com.sun.javafx.application.launchempl.startToolkit上(launchempl.java:675) 位于com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:695) 在com.sun.javafx.application.launchempl.lambda$launchApplication$155(launchempl.java:182) 运行(Thread.java:748) 原因:java.lang.UnsatisfiedLink错误:本机库C:\Program Files\java\jdk1.8.0\u 144\jre\bin\glass.dll已加载到另一个类加载器中 位于java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1907) 位于java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824) 位于java.lang.Runtime.load0(Runtime.java:809) 位于java.lang.System.load(System.java:1086) 位于com.sun.glass.utils.NativeLibLoader.loadLibraryFullPath(NativeLibLoader.java:201) 位于com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:94) 位于com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:39) 位于com.sun.glass.ui.Application.loadNativeLibrary(Application.java:112) 位于com.sun.glass.ui.Application.loadNativeLibrary(Application.java:120) com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39) 位于com.sun.glass.ui.win.WinApplication$1.run(WinApplication.java:118) 位于com.sun.glass.ui.win.WinApplication$1.run(WinApplication.java:91) 位于java.security.AccessController.doPrivileged(本机方法) 位于com.sun.glass.ui.win.WinApplication.(WinApplication.java:91) 位于com.sun.glass.ui.win.WinPlatformFactory.createApplication(WinPlatformFactory.java:39) 位于com.sun.glass.ui.win.WinPlatformFactory.createApplication(WinPlatformFactory.java:36) 位于com.sun.glass.ui.Application.run(Application.java:146) 位于com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:257) ... 还有5个 仅在第一类中初始化线程时发生异常

java.lang.ExceptionInInitializerError
        at sun.reflect.GeneratedSerializationConstructorAccessor12.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:45)
        at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:73)
        at org.mockito.internal.creation.instance.ObjenesisInstantiator.newInstance(ObjenesisInstantiator.java:14)
        at org.powermock.api.mockito.repackaged.ClassImposterizer.createProxy(ClassImposterizer.java:149)
        at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:64)
        at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMethodInvocationControl(DefaultMockCreator.java:121)
        at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMock(DefaultMockCreator.java:69)
        at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.mock(DefaultMockCreator.java:46)
        at org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:141)
        at 
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
        at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
        at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298)
        at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
        at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
        at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
        at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
        at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:121)
        at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
        at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
        at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.lang.IllegalStateException: Toolkit not initialized
        at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:273)
        at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:268)
        at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:550)
        at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:512)
        at javafx.scene.control.Control.<clinit>(Control.java:87)
        ... 50 more
java.lang.ExceptionInInitializeError
位于sun.reflect.GeneratedSerializationConstructorAccessor12.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:45)
位于org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:73)
位于org.mockito.internal.creation.instance.ObjenesisInstantiator.newInstance(ObjenesisInstantiator.java:14)
位于org.powermock.api.mockito.repacked.ClassImposterizer.createProxy(ClassImposterizer.java:149)
位于org.powermock.api.mockito.repacked.ClassImposterizer.importise(ClassImposterizer.java:64)
位于org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMethodInvocationControl(DefaultMockCreator.java:121)
位于org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMock(DefaultMockCreator.java:69)
位于org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.mock(DefaultMockCreator.java:46)
位于org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:141)
在
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
位于org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
位于org.junit.internal.runners.MethodRoadie.runbeforesthentestthenuter(MethodRoadie.java:97)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
在org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImp
@BeforeClass
public void init() {
    MockApp.init();
}