JavaFX:填充模拟列表视图导致 Maven 测试构建期间出现空指针异常
JavaFX: Populating mock list view causes null pointer exception during Maven test build
方法lvSelected.setItems(selectedList) 导致以下代码出现空指针异常,但仅当我尝试使用 Maven 清理测试时,并且仅当使用 32 位 JRE 时。是什么原因造成的?当我调试时,ListView 和 ObservableList 似乎都不为空。
这是部分代码,其中包含一个在使用 setItems 方法时失败的测试方法:
public class CommunicationParametersControllerTest extends ApplicationTest {
@InjectMocks
public CommunicationParametersController cpc;
@Mock
public ListView<TableRowDisplayCodes> lvSelected, lvCodes;
@Mock
public TableRowDisplayCodes tableRowDisplayCodes;
@Mock
public ObservableList<TableRowDisplayCodes> codesList;
@Mock
public ObservableList<TableRowDisplayCodes> selectedList;
public int MAX_OU_ITEMS = 30;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void checkIfIsAddingItemUsingAddListItemMethod() throws Exception {
selectedList = FXCollections.observableArrayList();
selectedList.add(new TableRowDisplayCodes(UOItems.UO_03));
lvSelected.setItems(selectedList);
invokeMethod(cpc, "addListItem", cpc.lvSelected, new TableRowDisplayCodes(UOItems.UO_04), MAX_OU_ITEMS);
assertEquals(2, lvSelected.getItems().size());
}
这是堆栈跟踪:
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running main.java.controllers.commands.GControllerTest
[ERROR] Tests run: 7, Failures: 0, Errors: 7, Skipped: 0, Time elapsed: 2.434 s <<< FAILURE! - in main.java.controllers.commands.GControllerTest
[ERROR] checThatTheNamesOfTheAddedItemsAreCorrect(main.java.controllers.commands.GControllerTest) Time elapsed: 0.791 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.checThatTheNamesOfTheAddedItemsAreCorrect(CommunicationParametersControllerTest.java:101)
[ERROR] mustNotInsertRepeateItemInAddListItem(main.java.controllers.commands.GControllerTest) Time elapsed: 0.258 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.mustNotInsertRepeateItemInAddListItem(CommunicationParametersControllerTest.java:121)
[ERROR] addTheMAximumNumberOfItemsInAddListItemWithIndex(main.java.controllers.commands.GControllerTest) Time elapsed: 0.256 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.addTheMAximumNumberOfItemsInAddListItemWithIndex(CommunicationParametersControllerTest.java:184)
[ERROR] checkIfIsAddingItemUsingAddListItemMethod(main.java.controllers.commands.GControllerTest) Time elapsed: 0.23 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.checkIfIsAddingItemUsingAddListItemMethod(CommunicationParametersControllerTest.java:45)
[ERROR] shouldThrowErrorWhenAddingItemWithWrongIndex(main.java.controllers.commands.GControllerTest) Time elapsed: 0.237 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.shouldThrowErrorWhenAddingItemWithWrongIndex(CommunicationParametersControllerTest.java:141)
[ERROR] addItemByIndexAndCHeckName(main.java.controllers.commands.GControllerTest) Time elapsed: 0.251 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.addItemByIndexAndCHeckName(CommunicationParametersControllerTest.java:132)
[ERROR] addTheMaximumNumberOfItemsInAddListItem(main.java.controllers.commands.GControllerTest) Time elapsed: 0.251 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.addTheMaximumNumberOfItemsInAddListItem(CommunicationParametersControllerTest.java:84)
[INFO] Running main.java.controllers.commands.GControllerTest
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.41 s - in main.java.controllers.commands.GControllerTest
[INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR] CommunicationParametersControllerTest.addItemByIndexAndCHeckName:132 » NullPointer
[ERROR] CommunicationParametersControllerTest.addTheMAximumNumberOfItemsInAddListItemWithIndex:184 » NullPointer
[ERROR] CommunicationParametersControllerTest.addTheMaximumNumberOfItemsInAddListItem:84 » NullPointer
[ERROR] CommunicationParametersControllerTest.checThatTheNamesOfTheAddedItemsAreCorrect:101 » NullPointer
[ERROR] CommunicationParametersControllerTest.checkIfIsAddingItemUsingAddListItemMethod:45 » NullPointer
[ERROR] CommunicationParametersControllerTest.mustNotInsertRepeateItemInAddListItem:121 » NullPointer
[ERROR] CommunicationParametersControllerTest.shouldThrowErrorWhenAddingItemWithWrongIndex:141 » NullPointer
[INFO]
[ERROR] Tests run: 11, Failures: 0, Errors: 7, Skipped: 0
[INFO]
[INFO] parallel='none', perCoreThreadCount=true, threadCount=0, useUnlimitedThreads=false, threadCountSuites=0, threadCountClasses=0, threadCountMethods=0, parallelOptimized=true
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:35 min
[INFO] Finished at: 2020-02-08T13:04:57-02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project ConfigFrontEnd: There are test failures.
[ERROR]
[ERROR] Please refer to C:\dev\ConfigFrontEnd\target\surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project ConfigFrontEnd: There are test failures.
Please refer to C:\dev\ConfigFrontEnd\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:215)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
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:497)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
Caused by: org.apache.maven.plugin.MojoFailureException: There are test failures.
Please refer to C:\dev\ConfigFrontEnd\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
at org.apache.maven.plugin.surefire.SurefireHelper.throwException(SurefireHelper.java:289)
at org.apache.maven.plugin.surefire.SurefireHelper.reportExecution(SurefireHelper.java:161)
at org.apache.maven.plugin.surefire.SurefirePlugin.handleSummary(SurefirePlugin.java:364)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1041)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
... 20 more
[ERROR]
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
我做了同样的应用程序,但我没有在 ListView 中使用模拟,我使用间谍方法在测试方法中创建了一个本地 ListView。
@Test
public void test() throws Exception {
@SuppressWarnings("unchecked")
ListView<TableRowDisplayCodes> lvSelected = spy(ListView.class);
codesList = FXCollections.observableArrayList();
selectedList = FXCollections.observableArrayList();
lvSelected.setItems(selectedList);
selectedList.add(new TableRowDisplayCodes(UOItems.UO_03));
invokeMethod(cpc, "addListItem", lvSelected, new TableRowDisplayCodes(UOItems.UO_04), MAX_OU_ITEMS);
assertEquals(2, lvSelected.getItems().size());
}
方法lvSelected.setItems(selectedList) 导致以下代码出现空指针异常,但仅当我尝试使用 Maven 清理测试时,并且仅当使用 32 位 JRE 时。是什么原因造成的?当我调试时,ListView 和 ObservableList 似乎都不为空。
这是部分代码,其中包含一个在使用 setItems 方法时失败的测试方法:
public class CommunicationParametersControllerTest extends ApplicationTest {
@InjectMocks
public CommunicationParametersController cpc;
@Mock
public ListView<TableRowDisplayCodes> lvSelected, lvCodes;
@Mock
public TableRowDisplayCodes tableRowDisplayCodes;
@Mock
public ObservableList<TableRowDisplayCodes> codesList;
@Mock
public ObservableList<TableRowDisplayCodes> selectedList;
public int MAX_OU_ITEMS = 30;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void checkIfIsAddingItemUsingAddListItemMethod() throws Exception {
selectedList = FXCollections.observableArrayList();
selectedList.add(new TableRowDisplayCodes(UOItems.UO_03));
lvSelected.setItems(selectedList);
invokeMethod(cpc, "addListItem", cpc.lvSelected, new TableRowDisplayCodes(UOItems.UO_04), MAX_OU_ITEMS);
assertEquals(2, lvSelected.getItems().size());
}
这是堆栈跟踪:
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running main.java.controllers.commands.GControllerTest
[ERROR] Tests run: 7, Failures: 0, Errors: 7, Skipped: 0, Time elapsed: 2.434 s <<< FAILURE! - in main.java.controllers.commands.GControllerTest
[ERROR] checThatTheNamesOfTheAddedItemsAreCorrect(main.java.controllers.commands.GControllerTest) Time elapsed: 0.791 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.checThatTheNamesOfTheAddedItemsAreCorrect(CommunicationParametersControllerTest.java:101)
[ERROR] mustNotInsertRepeateItemInAddListItem(main.java.controllers.commands.GControllerTest) Time elapsed: 0.258 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.mustNotInsertRepeateItemInAddListItem(CommunicationParametersControllerTest.java:121)
[ERROR] addTheMAximumNumberOfItemsInAddListItemWithIndex(main.java.controllers.commands.GControllerTest) Time elapsed: 0.256 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.addTheMAximumNumberOfItemsInAddListItemWithIndex(CommunicationParametersControllerTest.java:184)
[ERROR] checkIfIsAddingItemUsingAddListItemMethod(main.java.controllers.commands.GControllerTest) Time elapsed: 0.23 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.checkIfIsAddingItemUsingAddListItemMethod(CommunicationParametersControllerTest.java:45)
[ERROR] shouldThrowErrorWhenAddingItemWithWrongIndex(main.java.controllers.commands.GControllerTest) Time elapsed: 0.237 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.shouldThrowErrorWhenAddingItemWithWrongIndex(CommunicationParametersControllerTest.java:141)
[ERROR] addItemByIndexAndCHeckName(main.java.controllers.commands.GControllerTest) Time elapsed: 0.251 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.addItemByIndexAndCHeckName(CommunicationParametersControllerTest.java:132)
[ERROR] addTheMaximumNumberOfItemsInAddListItem(main.java.controllers.commands.GControllerTest) Time elapsed: 0.251 s <<< ERROR!
java.lang.NullPointerException
at main.java.controllers.commands.GControllerTest.addTheMaximumNumberOfItemsInAddListItem(CommunicationParametersControllerTest.java:84)
[INFO] Running main.java.controllers.commands.GControllerTest
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.41 s - in main.java.controllers.commands.GControllerTest
[INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR] CommunicationParametersControllerTest.addItemByIndexAndCHeckName:132 » NullPointer
[ERROR] CommunicationParametersControllerTest.addTheMAximumNumberOfItemsInAddListItemWithIndex:184 » NullPointer
[ERROR] CommunicationParametersControllerTest.addTheMaximumNumberOfItemsInAddListItem:84 » NullPointer
[ERROR] CommunicationParametersControllerTest.checThatTheNamesOfTheAddedItemsAreCorrect:101 » NullPointer
[ERROR] CommunicationParametersControllerTest.checkIfIsAddingItemUsingAddListItemMethod:45 » NullPointer
[ERROR] CommunicationParametersControllerTest.mustNotInsertRepeateItemInAddListItem:121 » NullPointer
[ERROR] CommunicationParametersControllerTest.shouldThrowErrorWhenAddingItemWithWrongIndex:141 » NullPointer
[INFO]
[ERROR] Tests run: 11, Failures: 0, Errors: 7, Skipped: 0
[INFO]
[INFO] parallel='none', perCoreThreadCount=true, threadCount=0, useUnlimitedThreads=false, threadCountSuites=0, threadCountClasses=0, threadCountMethods=0, parallelOptimized=true
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:35 min
[INFO] Finished at: 2020-02-08T13:04:57-02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project ConfigFrontEnd: There are test failures.
[ERROR]
[ERROR] Please refer to C:\dev\ConfigFrontEnd\target\surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project ConfigFrontEnd: There are test failures.
Please refer to C:\dev\ConfigFrontEnd\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:215)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
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:497)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
Caused by: org.apache.maven.plugin.MojoFailureException: There are test failures.
Please refer to C:\dev\ConfigFrontEnd\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
at org.apache.maven.plugin.surefire.SurefireHelper.throwException(SurefireHelper.java:289)
at org.apache.maven.plugin.surefire.SurefireHelper.reportExecution(SurefireHelper.java:161)
at org.apache.maven.plugin.surefire.SurefirePlugin.handleSummary(SurefirePlugin.java:364)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1041)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
... 20 more
[ERROR]
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
我做了同样的应用程序,但我没有在 ListView 中使用模拟,我使用间谍方法在测试方法中创建了一个本地 ListView。
@Test
public void test() throws Exception {
@SuppressWarnings("unchecked")
ListView<TableRowDisplayCodes> lvSelected = spy(ListView.class);
codesList = FXCollections.observableArrayList();
selectedList = FXCollections.observableArrayList();
lvSelected.setItems(selectedList);
selectedList.add(new TableRowDisplayCodes(UOItems.UO_03));
invokeMethod(cpc, "addListItem", lvSelected, new TableRowDisplayCodes(UOItems.UO_04), MAX_OU_ITEMS);
assertEquals(2, lvSelected.getItems().size());
}