Index: ivy.xml
===================================================================
--- ivy.xml	(revision 16705)
+++ ivy.xml	(working copy)
@@ -50,7 +50,7 @@
             <artifact name="org.jacoco.ant" type="jar" maven:classifier="nodeps"/>
         </dependency>
         <!-- jmockit->default - Don't upgrade JMockit until https://josm.openstreetmap.de/ticket/18200 is resolved -->
-        <dependency conf="jmockit->default" org="org.jmockit" name="jmockit" rev="1.44"/>
+        <dependency conf="jmockit->default" org="org.jmockit" name="jmockit" rev="1.49"/>
         <!-- test->default -->
         <dependency conf="test->default" org="com.github.spotbugs" name="spotbugs-annotations" rev="4.0.1"/>
         <dependency conf="test->default" org="com.github.stefanbirkner" name="system-rules" rev="1.19.0">
Index: src/org/openstreetmap/josm/gui/MapViewState.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapViewState.java	(revision 16705)
+++ src/org/openstreetmap/josm/gui/MapViewState.java	(working copy)
@@ -131,7 +131,12 @@
         this(projecting, mvs.viewWidth, mvs.viewHeight, mvs.scale, mvs.topLeft, mvs.topLeftInWindow, mvs.topLeftOnScreen);
     }
 
-    private static Point findTopLeftInWindow(JComponent position) {
+    /**
+     * This is visible for JMockit.
+     *
+     * @param position The component to get the top left position of its window
+     */
+    static Point findTopLeftInWindow(JComponent position) {
         Point result = new Point();
         // better than using swing utils, since this allows us to use the method if no screen is present.
         Container component = position;
@@ -143,7 +148,12 @@
         return result;
     }
 
-    private static Point findTopLeftOnScreen(JComponent position) {
+    /**
+     * This is visible for JMockit.
+     *
+     * @param position The component to get the top left position of its screen
+     */
+    static Point findTopLeftOnScreen(JComponent position) {
         try {
             return position.getLocationOnScreen();
         } catch (JosmRuntimeException | IllegalArgumentException | IllegalStateException e) {
Index: src/org/openstreetmap/josm/gui/util/GuiHelper.java
===================================================================
--- src/org/openstreetmap/josm/gui/util/GuiHelper.java	(revision 16705)
+++ src/org/openstreetmap/josm/gui/util/GuiHelper.java	(working copy)
@@ -203,7 +203,13 @@
         }
     }
 
-    private static void handleEDTException(Throwable t) {
+    /**
+     * Handle exceptions in the EDT. This should only be used in {@link GuiHelper}
+     * and {@link org.openstreetmap.josm.testutils.mockers.EDTAssertionMocker}.
+     *
+     * @param t The throwable to handle
+     */
+    static void handleEDTException(Throwable t) {
         Logging.logWithStackTrace(Logging.LEVEL_ERROR, t, "Exception raised in EDT");
     }
 
Index: test/unit/org/openstreetmap/josm/testutils/mockers/EDTAssertionMocker.java
===================================================================
--- test/unit/org/openstreetmap/josm/testutils/mockers/EDTAssertionMocker.java	(revision 16705)
+++ test/unit/org/openstreetmap/josm/testutils/mockers/EDTAssertionMocker.java	(working copy)
@@ -13,7 +13,7 @@
  */
 public class EDTAssertionMocker extends MockUp<GuiHelper> {
     @Mock
-    private static void handleEDTException(final Invocation invocation, final Throwable t) {
+    static void handleEDTException(final Invocation invocation, final Throwable t) throws Throwable {
         final Throwable cause = t.getCause();
         if (cause instanceof AssertionError) {
             throw (AssertionError) cause;
Index: test/unit/org/openstreetmap/josm/testutils/mockers/ExtendedDialogMocker.java
===================================================================
--- test/unit/org/openstreetmap/josm/testutils/mockers/ExtendedDialogMocker.java	(revision 16705)
+++ test/unit/org/openstreetmap/josm/testutils/mockers/ExtendedDialogMocker.java	(working copy)
@@ -5,19 +5,19 @@
 
 import java.awt.Component;
 import java.awt.GraphicsEnvironment;
+import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Optional;
 import java.util.WeakHashMap;
 
+import org.junit.platform.commons.util.ReflectionUtils;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.tools.Logging;
 
-import mockit.Deencapsulation;
 import mockit.Invocation;
 import mockit.Mock;
-import mockit.internal.reflection.FieldReflection;
 
 /**
  * MockUp for {@link ExtendedDialog} allowing a test to pre-seed uses of {@link ExtendedDialog}
@@ -76,7 +76,8 @@
     }
 
     protected int getButtonPositionFromLabel(final ExtendedDialog instance, final String label) {
-        final String[] bTexts = Deencapsulation.getField(instance, "bTexts");
+        final String[] bTexts = (String[]) ReflectionUtils.tryToReadFieldValue(ExtendedDialog.class, "bTexts", instance).toOptional()
+            .orElse(null);
         final int position = Arrays.asList(bTexts).indexOf(label);
         if (position == -1) {
             fail("Unable to find button labeled \"" + label + "\". Instead found: " + Arrays.toString(bTexts));
@@ -150,7 +151,7 @@
     }
 
     @Mock
-    private void setVisible(final Invocation invocation, final boolean value) {
+    private void setVisible(final Invocation invocation, final boolean value) throws Throwable {
         if (value == true) {
             try {
                 final ExtendedDialog instance = invocation.getInvokedInstance();
@@ -157,7 +158,9 @@
                 this.act(instance);
                 final int mockResult = this.getMockResult(instance);
                 // TODO check validity of mockResult?
-                FieldReflection.setField(instance.getClass(), instance, "result", mockResult);
+                Field resultField = instance.getClass().getDeclaredField("result");
+                resultField.setAccessible(true);
+                resultField.set(instance, mockResult);
                 Logging.info(
                     "{0} answering {1} to ExtendedDialog with content {2}",
                     this.getClass().getName(),
@@ -165,7 +168,7 @@
                     this.getString(instance)
                 );
                 this.getInvocationLogInternal().add(this.getInvocationLogEntry(instance, mockResult));
-            } catch (AssertionError e) {
+            } catch (AssertionError | NoSuchFieldException | IllegalAccessException e) {
                 // in case this exception gets ignored by the calling thread we want to signify this failure
                 // in the invocation log. it's hard to know what to add to the log in these cases as it's
                 // probably unsafe to call getInvocationLogEntry, so add the exception on its own.
Index: test/unit/org/openstreetmap/josm/testutils/mockers/WindowlessMapViewStateMocker.java
===================================================================
--- test/unit/org/openstreetmap/josm/testutils/mockers/WindowlessMapViewStateMocker.java	(revision 16705)
+++ test/unit/org/openstreetmap/josm/testutils/mockers/WindowlessMapViewStateMocker.java	(working copy)
@@ -16,12 +16,12 @@
  */
 public class WindowlessMapViewStateMocker extends MockUp<MapViewState> {
     @Mock
-    private static Point findTopLeftInWindow(JComponent position) {
+    static Point findTopLeftInWindow(JComponent position) {
         return new Point();
     }
 
     @Mock
-    private static Point findTopLeftOnScreen(JComponent position) {
+    static Point findTopLeftOnScreen(JComponent position) {
         // in our imaginary universe the window is always (10, 10) from the top left of the screen
         Point topLeftInWindow = findTopLeftInWindow(position);
         return new Point(topLeftInWindow.x + 10, topLeftInWindow.y + 10);
