You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2020/09/08 11:29:36 UTC

[openmeetings] branch master updated: [OPENMEETINGS-2423] import should be fixed

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new e213b36  [OPENMEETINGS-2423] import should be fixed
e213b36 is described below

commit e213b3647f5e22e2e610e3b4fe321ac2f2c60f25
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Tue Sep 8 18:28:20 2020 +0700

    [OPENMEETINGS-2423] import should be fixed
---
 .../openmeetings/core/remote/AbstractStream.java   |   6 +-
 .../org/apache/openmeetings/TestConnection.java    |   2 +-
 .../openmeetings/core/remote/BaseMockedTest.java   |  64 +++++++++----
 .../core/remote/TestNotConnectedMocked.java        |   6 +-
 .../core/remote/TestRecordingFlowMocked.java       |  41 ++++----
 .../core/remote/TestRoomFlowMocked.java            |  94 ++++++++++---------
 .../core/remote/TestSetupFlowMocked.java           | 104 ++++++++++-----------
 .../java/org/apache/openmeetings/gui/TestGui.java  |   2 +-
 .../openmeetings/rdc/TestKeyCodesNumber.java       |   2 +-
 .../openmeetings/rdc/TestReadKeyCodesNumber.java   |   2 +-
 .../openmeetings/db/entity/file/FileItemTest.java  |  76 ++++++---------
 .../apache/openmeetings/backup/BackupImport.java   |  18 ++++
 openmeetings-web/pom.xml                           |   2 +-
 .../openmeetings/web/common/menu/OmMenuItem.java   |  34 ++++---
 .../web/pages/install/InstallWizard.java           |   7 +-
 .../apache/openmeetings/backup/TestImportOld.java  |  31 ++++++
 .../openmeetings/backup/jira2423/backup_2423.zip   | Bin 0 -> 25722 bytes
 pom.xml                                            |  32 +------
 18 files changed, 282 insertions(+), 241 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/AbstractStream.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/AbstractStream.java
index 1224288..c1376d2 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/AbstractStream.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/AbstractStream.java
@@ -47,17 +47,17 @@ public abstract class AbstractStream {
 
 	public abstract void release(IStreamProcessor processor, boolean remove);
 
-	public WebRtcEndpoint createWebRtcEndpoint(MediaPipeline pipeline) {
+	public static WebRtcEndpoint createWebRtcEndpoint(MediaPipeline pipeline) {
 		return new WebRtcEndpoint.Builder(pipeline).build();
 	}
 
-	public RecorderEndpoint createRecorderEndpoint(MediaPipeline pipeline, String path, MediaProfileSpecType profile) {
+	public static RecorderEndpoint createRecorderEndpoint(MediaPipeline pipeline, String path, MediaProfileSpecType profile) {
 		return new RecorderEndpoint.Builder(pipeline, path)
 				.stopOnEndOfStream()
 				.withMediaProfile(profile).build();
 	}
 
-	public PlayerEndpoint createPlayerEndpoint(MediaPipeline pipeline, String path) {
+	public static PlayerEndpoint createPlayerEndpoint(MediaPipeline pipeline, String path) {
 		return new PlayerEndpoint.Builder(pipeline, path).build();
 	}
 }
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/TestConnection.java b/openmeetings-core/src/test/java/org/apache/openmeetings/TestConnection.java
index 0a271ae..ba0eba8 100644
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/TestConnection.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/TestConnection.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 public class TestConnection {
 
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
index f8f4b6b..154c6a7 100644
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
@@ -20,30 +20,39 @@
 package org.apache.openmeetings.core.remote;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.when;
-import static org.mockito.MockitoAnnotations.initMocks;
-import static org.powermock.api.mockito.PowerMockito.mockStatic;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.lenient;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+
+import java.util.Locale;
 
 import org.apache.openmeetings.core.util.WebSocketHelper;
-import org.junit.Before;
-import org.junit.runner.RunWith;
+import org.apache.openmeetings.db.dao.label.LabelDao;
+import org.apache.openmeetings.db.entity.basic.IWsClient;
+import org.apache.openmeetings.db.entity.label.OmLanguage;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.kurento.client.KurentoClient;
-import org.kurento.client.KurentoConnectionListener;
+import org.kurento.client.MediaPipeline;
+import org.kurento.client.MediaProfileSpecType;
+import org.kurento.client.PlayerEndpoint;
+import org.kurento.client.RecorderEndpoint;
 import org.kurento.client.ServerManager;
+import org.kurento.client.WebRtcEndpoint;
 import org.kurento.client.internal.TransactionImpl;
 import org.kurento.client.internal.client.RomManager;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.MockedStatic;
 import org.mockito.Spy;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.stubbing.Answer;
 
 import com.github.openjson.JSONObject;
 
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({KurentoClient.class, WebSocketHelper.class, AbstractStream.class})
+@ExtendWith(MockitoExtension.class)
 public class BaseMockedTest {
 	@Mock
 	protected RomManager romManager;
@@ -63,14 +72,31 @@ public class BaseMockedTest {
 
 	protected final static JSONObject MSG_BASE = new JSONObject();
 
-	@Before
+	@BeforeEach
 	public void setup() {
-		initMocks(this);
-		mockStatic(KurentoClient.class);
-		mockStatic(WebSocketHelper.class);
-		doReturn(kServerManager).when(client).getServerManager();
-		when(KurentoClient.create(nullable(String.class), any(KurentoConnectionListener.class))).thenReturn(client);
-		doReturn(new TransactionImpl(romManager)).when(client).beginTransaction();
+		lenient().doReturn(kServerManager).when(client).getServerManager();
+		lenient().doReturn(new TransactionImpl(romManager)).when(client).beginTransaction();
 		handler.init();
 	}
+
+	void runWrapped(Runnable task) {
+		try (MockedStatic<AbstractStream> streamMock = mockStatic(AbstractStream.class);
+				MockedStatic<WebSocketHelper> wsHelperMock = mockStatic(WebSocketHelper.class);
+				MockedStatic<LabelDao> labelMock = mockStatic(LabelDao.class);
+				)
+		{
+			wsHelperMock.when(() -> WebSocketHelper.sendClient(any(IWsClient.class), any(JSONObject.class))).thenAnswer(new Answer<Void>() {
+				@Override
+				public Void answer(InvocationOnMock invocation) throws Throwable {
+					return null;
+				}
+			});
+			streamMock.when(() -> AbstractStream.createWebRtcEndpoint(any(MediaPipeline.class))).thenReturn(mock(WebRtcEndpoint.class));
+			streamMock.when(() -> AbstractStream.createRecorderEndpoint(any(MediaPipeline.class), anyString(), any(MediaProfileSpecType.class))).thenReturn(mock(RecorderEndpoint.class));
+			streamMock.when(() -> AbstractStream.createPlayerEndpoint(any(MediaPipeline.class), anyString())).thenReturn(mock(PlayerEndpoint.class));
+
+			labelMock.when(() -> LabelDao.getLanguage(any(Long.class))).thenReturn(new OmLanguage(Locale.ENGLISH));
+			task.run();
+		}
+	}
 }
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestNotConnectedMocked.java b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestNotConnectedMocked.java
index dd67727..05d89a3 100644
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestNotConnectedMocked.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestNotConnectedMocked.java
@@ -19,10 +19,10 @@
  */
 package org.apache.openmeetings.core.remote;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import com.github.openjson.JSONObject;
 
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
index 5f22af0..5e418f0 100644
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
@@ -19,40 +19,34 @@
  */
 package org.apache.openmeetings.core.remote;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.Locale;
-
-import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.Client.Activity;
 import org.apache.openmeetings.db.entity.basic.Client.StreamDesc;
-import org.apache.openmeetings.db.entity.label.OmLanguage;
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.manager.IClientManager;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.kurento.client.MediaPipeline;
 import org.kurento.client.Transaction;
-import org.mockito.BDDMockito;
 import org.mockito.Mock;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
 
 import com.github.openjson.JSONObject;
 
-@PrepareForTest(LabelDao.class)
 public class TestRecordingFlowMocked extends BaseMockedTest {
 	private static final Long USER_ID = 1L;
 	private static final Long ROOM_ID = 5L;
@@ -72,6 +66,7 @@ public class TestRecordingFlowMocked extends BaseMockedTest {
 	private String streamDescUID;
 
 	@Override
+	@BeforeEach
 	public void setup() {
 		super.setup();
 		doReturn(mock(MediaPipeline.class)).when(client).createMediaPipeline(any(Transaction.class));
@@ -88,9 +83,6 @@ public class TestRecordingFlowMocked extends BaseMockedTest {
 			return r;
 		});
 
-		PowerMockito.mockStatic(LabelDao.class);
-		BDDMockito.given(LabelDao.getLanguage(any(Long.class))).willReturn(new OmLanguage(Locale.ENGLISH));
-
 		// init client object for this test
 		c = getClientFull();
 		doReturn(c.getRoom()).when(roomDao).get(ROOM_ID);
@@ -119,13 +111,18 @@ public class TestRecordingFlowMocked extends BaseMockedTest {
 	}
 
 	@Test
-	public void testRecordingFlow() throws Exception {
-
-		// start recording and simulate broadcast starting
-		testStartRecordWhenSharingWasNot();
-
-		// stop recording
-		testStopRecordingWhenNoSharingStarted();
+	public void testRecordingFlow() {
+		runWrapped(() -> {
+			try {
+				// start recording and simulate broadcast starting
+				testStartRecordWhenSharingWasNot();
+
+				// stop recording
+				testStopRecordingWhenNoSharingStarted();
+			} catch (Exception e) {
+				fail("Unexpected exception", e);
+			}
+		});
 	}
 
 	/**
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRoomFlowMocked.java b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRoomFlowMocked.java
index 9a1cf0b..26fac73 100644
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRoomFlowMocked.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRoomFlowMocked.java
@@ -19,36 +19,29 @@
  */
 package org.apache.openmeetings.core.remote;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
-import java.util.Locale;
-
-import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.Client;
-import org.apache.openmeetings.db.entity.label.OmLanguage;
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.manager.IClientManager;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.kurento.client.MediaPipeline;
 import org.kurento.client.Transaction;
-import org.mockito.BDDMockito;
 import org.mockito.Mock;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
 
 import com.github.openjson.JSONObject;
 
-@PrepareForTest(LabelDao.class)
 public class TestRoomFlowMocked extends BaseMockedTest {
 	private static final Long USER_ID = 1L;
 	private static final Long ROOM_ID = 5L;
@@ -62,16 +55,17 @@ public class TestRoomFlowMocked extends BaseMockedTest {
 	private IClientManager cm;
 
 	@Override
+	@BeforeEach
 	public void setup() {
 		super.setup();
-		doReturn(mock(MediaPipeline.class)).when(client).createMediaPipeline(any(Transaction.class));
+		lenient().doReturn(mock(MediaPipeline.class)).when(client).createMediaPipeline(any(Transaction.class));
 		User u = new User();
 		u.setId(USER_ID);
 		u.setFirstname("firstname");
 		u.setLastname("lastname");
-		doReturn(u).when(userDao).get(USER_ID);
+		lenient().doReturn(u).when(userDao).get(USER_ID);
 		doReturn(true).when(handler).isConnected();
-		when(recDao.update(any(Recording.class))).thenAnswer((invocation) ->  {
+		lenient().when(recDao.update(any(Recording.class))).thenAnswer((invocation) ->  {
 			Object[] args = invocation.getArguments();
 			Recording r = (Recording) args[0];
 			r.setId(1L);
@@ -81,7 +75,9 @@ public class TestRoomFlowMocked extends BaseMockedTest {
 
 	@Test
 	public void testNoClient() {
-		handler.onMessage(null, MSG_BASE.put("id", "aa"));
+		runWrapped(() -> {
+			handler.onMessage(null, MSG_BASE.put("id", "aa"));
+		});
 	}
 
 	private Client getClient() {
@@ -90,21 +86,25 @@ public class TestRoomFlowMocked extends BaseMockedTest {
 
 	@Test
 	public void testNoRoom() {
-		handler.onMessage(getClient(), MSG_BASE.put("id", "aa"));
+		runWrapped(() -> {
+			handler.onMessage(getClient(), MSG_BASE.put("id", "aa"));
+		});
 	}
 
 	@Test
 	public void testRecordingAllowed() {
-		Client c = getClient();
-		assertFalse(streamProcessor.recordingAllowed(c));
-		c.setRoom(new Room());
-		assertFalse(streamProcessor.recordingAllowed(c));
-		c.getRoom().setId(ROOM_ID);
-		c.getRoom().setAllowRecording(true);
-		assertFalse(streamProcessor.recordingAllowed(c));
-		c.allow(Room.Right.MODERATOR);
-		doReturn(c.getRoom()).when(roomDao).get(ROOM_ID);
-		assertTrue(streamProcessor.recordingAllowed(c));
+		runWrapped(() -> {
+			Client c = getClient();
+			assertFalse(streamProcessor.recordingAllowed(c));
+			c.setRoom(new Room());
+			assertFalse(streamProcessor.recordingAllowed(c));
+			c.getRoom().setId(ROOM_ID);
+			c.getRoom().setAllowRecording(true);
+			assertFalse(streamProcessor.recordingAllowed(c));
+			c.allow(Room.Right.MODERATOR);
+			doReturn(c.getRoom()).when(roomDao).get(ROOM_ID);
+			assertTrue(streamProcessor.recordingAllowed(c));
+		});
 	}
 
 	private Client getClientWithRoom() {
@@ -129,28 +129,30 @@ public class TestRoomFlowMocked extends BaseMockedTest {
 
 	@Test
 	public void testWannaRecord2() throws Exception {
-		JSONObject msg = new JSONObject(MSG_BASE.toString()).put("id", "wannaRecord");
-		Client c = getClientFull();
-		c.getRoom().setType(Room.Type.INTERVIEW);
-		doReturn(c.getRoom()).when(roomDao).get(ROOM_ID);
-		handler.onMessage(c, msg);
+		runWrapped(() -> {
+			JSONObject msg = new JSONObject(MSG_BASE.toString()).put("id", "wannaRecord");
+			Client c = getClientFull();
+			c.getRoom().setType(Room.Type.INTERVIEW);
+			doReturn(c.getRoom()).when(roomDao).get(ROOM_ID);
+			handler.onMessage(c, msg);
+		});
 	}
 
 	@Test
 	public void testRecordRecord() throws Exception {
-		PowerMockito.mockStatic(LabelDao.class);
-		BDDMockito.given(LabelDao.getLanguage(any(Long.class))).willReturn(new OmLanguage(Locale.ENGLISH));
-		JSONObject msg = new JSONObject(MSG_BASE.toString())
-				.put("id", "wannaRecord")
-				.put("width", 640)
-				.put("height", 480)
-				.put("shareType", "shareType")
-				.put("fps", "fps")
-				;
-		Client c = getClientFull();
-		doReturn(c.getRoom()).when(roomDao).get(ROOM_ID);
-		handler.onMessage(c, msg);
-		assertTrue(streamProcessor.isSharing(ROOM_ID));
-		handler.onMessage(c, msg);
+		runWrapped(() -> {
+			JSONObject msg = new JSONObject(MSG_BASE.toString())
+					.put("id", "wannaRecord")
+					.put("width", 640)
+					.put("height", 480)
+					.put("shareType", "shareType")
+					.put("fps", "fps")
+					;
+			Client c = getClientFull();
+			doReturn(c.getRoom()).when(roomDao).get(ROOM_ID);
+			handler.onMessage(c, msg);
+			assertTrue(streamProcessor.isSharing(ROOM_ID));
+			handler.onMessage(c, msg);
+		});
 	}
 }
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestSetupFlowMocked.java b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestSetupFlowMocked.java
index 558b394..923e8a6 100644
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestSetupFlowMocked.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestSetupFlowMocked.java
@@ -23,24 +23,20 @@ import static org.apache.openmeetings.core.remote.KurentoHandler.MODE_TEST;
 import static org.apache.openmeetings.core.remote.KurentoHandler.PARAM_CANDIDATE;
 import static org.apache.openmeetings.core.remote.KurentoHandler.TAG_MODE;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.powermock.api.mockito.PowerMockito.whenNew;
 
 import org.apache.openmeetings.db.entity.basic.WsClient;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.kurento.client.MediaPipeline;
-import org.kurento.client.MediaProfileSpecType;
-import org.kurento.client.PlayerEndpoint;
-import org.kurento.client.RecorderEndpoint;
 import org.kurento.client.Transaction;
-import org.kurento.client.WebRtcEndpoint;
 
 import com.github.openjson.JSONObject;
 
 public class TestSetupFlowMocked extends BaseMockedTest {
 	@Override
+	@BeforeEach
 	public void setup() {
 		super.setup();
 		doReturn(true).when(handler).isConnected();
@@ -49,71 +45,69 @@ public class TestSetupFlowMocked extends BaseMockedTest {
 
 	@Test
 	public void testMsgTestWannaRecord() throws Exception {
-		JSONObject msg = new JSONObject(MSG_BASE.toString()).put("id", "wannaRecord");
-		WsClient c = new WsClient("sessionId", 0);
-		handler.onMessage(c, msg);
+		runWrapped(() -> {
+			JSONObject msg = new JSONObject(MSG_BASE.toString()).put("id", "wannaRecord");
+			WsClient c = new WsClient("sessionId", 0);
+			handler.onMessage(c, msg);
+		});
 	}
 
 	@Test
 	public void testMsgTestRecord1() throws Exception {
-		doReturn(mock(MediaPipeline.class)).when(client).createMediaPipeline(any(Transaction.class));
-		WebRtcEndpoint.Builder builder = mock(WebRtcEndpoint.Builder.class);
-		whenNew(WebRtcEndpoint.Builder.class).withArguments(any(MediaPipeline.class)).thenReturn(builder);
-		doReturn(mock(WebRtcEndpoint.class)).when(builder).build();
+		runWrapped(() -> {
+			doReturn(mock(MediaPipeline.class)).when(client).createMediaPipeline(any(Transaction.class));
 
-		RecorderEndpoint.Builder recBuilder = mock(RecorderEndpoint.Builder.class);
-		whenNew(RecorderEndpoint.Builder.class).withArguments(any(MediaPipeline.class), anyString()).thenReturn(recBuilder);
-		doReturn(recBuilder).when(recBuilder).stopOnEndOfStream();
-		doReturn(recBuilder).when(recBuilder).withMediaProfile(any(MediaProfileSpecType.class));
-		doReturn(mock(RecorderEndpoint.class)).when(recBuilder).build();
-
-		WsClient c = new WsClient("sessionId", 0);
-		for (boolean audio : new boolean[] {true, false}) {
-			for (boolean video : new boolean[] {true, false}) {
-				JSONObject msg = new JSONObject(MSG_BASE.toString())
-						.put("id", "record")
-						.put("sdpOffer", "")
-						.put("audio", audio)
-						.put("video", video);
-				handler.onMessage(c, msg);
+			WsClient c = new WsClient("sessionId", 0);
+			for (boolean audio : new boolean[] {true, false}) {
+				for (boolean video : new boolean[] {true, false}) {
+					JSONObject msg = new JSONObject(MSG_BASE.toString())
+							.put("id", "record")
+							.put("sdpOffer", "")
+							.put("audio", audio)
+							.put("video", video);
+					handler.onMessage(c, msg);
+				}
 			}
-		}
-		JSONObject iceMsg = new JSONObject(MSG_BASE.toString())
-				.put("id", "iceCandidate")
-				.put(PARAM_CANDIDATE, new JSONObject()
-						.put(PARAM_CANDIDATE, "candidate")
-						.put("sdpMid", "sdpMid")
-						.put("sdpMLineIndex", 1));
-		handler.onMessage(c, iceMsg);
-		PlayerEndpoint.Builder playBuilder = mock(PlayerEndpoint.Builder.class);
-		whenNew(PlayerEndpoint.Builder.class).withArguments(any(MediaPipeline.class), anyString()).thenReturn(playBuilder);
-		doReturn(mock(PlayerEndpoint.class)).when(playBuilder).build();
-		handler.onMessage(c, new JSONObject(MSG_BASE.toString())
-				.put("id", "play")
-				.put("sdpOffer", "sdpOffer"));
-		testProcessor.destroy();
+			JSONObject iceMsg = new JSONObject(MSG_BASE.toString())
+					.put("id", "iceCandidate")
+					.put(PARAM_CANDIDATE, new JSONObject()
+							.put(PARAM_CANDIDATE, "candidate")
+							.put("sdpMid", "sdpMid")
+							.put("sdpMLineIndex", 1));
+			handler.onMessage(c, iceMsg);
+			handler.onMessage(c, new JSONObject(MSG_BASE.toString())
+					.put("id", "play")
+					.put("sdpOffer", "sdpOffer"));
+			testProcessor.destroy();
+		});
 	}
 
 	@Test
 	public void testMsgTestIceCandidate() throws Exception {
-		JSONObject msg = new JSONObject(MSG_BASE.toString())
-				.put("id", "iceCandidate")
-				.put(KurentoHandler.PARAM_CANDIDATE, new JSONObject());
-		WsClient c = new WsClient("sessionId", 0);
-		handler.onMessage(c, msg);
+		runWrapped(() -> {
+			JSONObject msg = new JSONObject(MSG_BASE.toString())
+					.put("id", "iceCandidate")
+					.put(KurentoHandler.PARAM_CANDIDATE, new JSONObject());
+			WsClient c = new WsClient("sessionId", 0);
+			handler.onMessage(c, msg);
+		});
 	}
 
 	@Test
 	public void testMsgTestWannaPlay() throws Exception {
-		JSONObject msg = new JSONObject(MSG_BASE.toString()).put("id", "wannaPlay");
-		WsClient c = new WsClient("sessionId", 0);
-		handler.onMessage(c, msg);
+		runWrapped(() -> {
+			JSONObject msg = new JSONObject(MSG_BASE.toString()).put("id", "wannaPlay");
+			WsClient c = new WsClient("sessionId", 0);
+			handler.onMessage(c, msg);
+		});
 	}
 
 	@Test
 	public void testMsgTestPlay() throws Exception {
-		JSONObject msg = new JSONObject(MSG_BASE.toString()).put("id", "play");
-		WsClient c = new WsClient("sessionId", 0);
-		handler.onMessage(c, msg);
+		runWrapped(() -> {
+			JSONObject msg = new JSONObject(MSG_BASE.toString()).put("id", "play");
+			WsClient c = new WsClient("sessionId", 0);
+			handler.onMessage(c, msg);
+		});
 	}
 }
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/gui/TestGui.java b/openmeetings-core/src/test/java/org/apache/openmeetings/gui/TestGui.java
index 2541fd0..7c27196 100644
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/gui/TestGui.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/gui/TestGui.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.gui;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 
 public class TestGui {
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/rdc/TestKeyCodesNumber.java b/openmeetings-core/src/test/java/org/apache/openmeetings/rdc/TestKeyCodesNumber.java
index 14e1a9b..f8e8e95 100644
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/rdc/TestKeyCodesNumber.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/rdc/TestKeyCodesNumber.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.rdc;
 
 import java.awt.event.KeyEvent;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/rdc/TestReadKeyCodesNumber.java b/openmeetings-core/src/test/java/org/apache/openmeetings/rdc/TestReadKeyCodesNumber.java
index 572cff7..29d3c07 100644
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/rdc/TestReadKeyCodesNumber.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/rdc/TestReadKeyCodesNumber.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.rdc;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/openmeetings-db/src/test/java/org/apache/openmeetings/db/entity/file/FileItemTest.java b/openmeetings-db/src/test/java/org/apache/openmeetings/db/entity/file/FileItemTest.java
index 11e5156..cc443c2 100644
--- a/openmeetings-db/src/test/java/org/apache/openmeetings/db/entity/file/FileItemTest.java
+++ b/openmeetings-db/src/test/java/org/apache/openmeetings/db/entity/file/FileItemTest.java
@@ -18,52 +18,26 @@
  */
 package org.apache.openmeetings.db.entity.file;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.when;
-import static org.mockito.MockitoAnnotations.initMocks;
-import static org.powermock.api.mockito.PowerMockito.mockStatic;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mockStatic;
 
 import java.io.File;
 
 import org.apache.openmeetings.util.OmFileHelper;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-
-@RunWith(PowerMockRunner.class)
-@PrepareForTest(OmFileHelper.class)
-public class FileItemTest {
-
-	@Mock
-	private OmFileHelper omFileHelper;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.MockedStatic;
+import org.mockito.junit.jupiter.MockitoExtension;
 
-	@InjectMocks
+@ExtendWith(MockitoExtension.class)
+public class FileItemTest {
 	private FileItem fileItem;
 
-	@Before
-	public void setup() {
-		initMocks(this);
-
-		// Setup path to be local test resources
-		mockStatic(OmFileHelper.class);
-
-		// PDF file tests
-		when(OmFileHelper.getFileExt("6594186e-c6bb-49d5-9f66-829e45599aaa.pdf")).thenReturn("pdf");
-
-		// DOCX file tests
-		when(OmFileHelper.getFileExt("d44ab2c5-fd5d-4903-8fa7-292286d72a5f.docx")).thenReturn("docx");
-		when(OmFileHelper.getFileExt("d44ab2c5-fd5d-4903-8fa7-292286d72a5f.pdf")).thenReturn("pdf");
-
-		// Generic
-		when(OmFileHelper.getFileExt("page-0000.png")).thenReturn("png");
-		when(OmFileHelper.getFileExt("page-0001.png")).thenReturn("png");
-
-		when(OmFileHelper.getUploadFilesDir()).thenReturn(new File("src/test/resources/org/apache/openmeetings/db/entity/file"));
+	@BeforeEach
+	void createNewStack() {
+		fileItem = new FileItem();
 	}
 
 	@Test
@@ -108,6 +82,13 @@ public class FileItemTest {
 		assertEquals(f.getName(), "6594186e-c6bb-49d5-9f66-829e45599aaa.pdf");
 	}
 
+	private void wrapper(Runnable r) {
+		try (MockedStatic<OmFileHelper> theMock = mockStatic(OmFileHelper.class)) {
+			theMock.when(OmFileHelper::getUploadFilesDir).thenReturn(new File("src/test/resources/org/apache/openmeetings/db/entity/file"));
+			r.run();
+		}
+	}
+
 	@Test
 	public void testGetOriginalWithDOCXWithOriginalName() {
 		// Setup file
@@ -116,10 +97,12 @@ public class FileItemTest {
 		fileItem.setName("Sample Document.docx");
 		fileItem.setType(BaseFileItem.Type.PRESENTATION);
 
-		File f = fileItem.getOriginal();
+		wrapper(() -> {
+			File f = fileItem.getOriginal();
 
-		assertTrue(f.getName().endsWith("docx"));
-		assertEquals(f.getName(), "d44ab2c5-fd5d-4903-8fa7-292286d72a5f.docx");
+			assertTrue(f.getName().endsWith("docx"));
+			assertEquals(f.getName(), "d44ab2c5-fd5d-4903-8fa7-292286d72a5f.docx");
+		});
 	}
 
 	@Test
@@ -129,11 +112,12 @@ public class FileItemTest {
 		fileItem.setHash("d44ab2c5-fd5d-4903-8fa7-292286d72a5f");
 		fileItem.setName("Random Name");
 		fileItem.setType(BaseFileItem.Type.PRESENTATION);
+		wrapper(() -> {
+			File f = fileItem.getOriginal();
 
-		File f = fileItem.getOriginal();
-
-		assertTrue(f.getName().endsWith("docx"));
-		assertEquals(f.getName(), "d44ab2c5-fd5d-4903-8fa7-292286d72a5f.docx");
+			assertTrue(f.getName().endsWith("docx"));
+			assertEquals(f.getName(), "d44ab2c5-fd5d-4903-8fa7-292286d72a5f.docx");
+		});
 	}
 
 	@Test
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index 5c1fcdb..ebc04e5 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
@@ -718,6 +718,13 @@ public class BackupImport {
 		readList(unmarshaller, base, "rooms.xml", ROOM_LIST_NODE, ROOM_NODE, eClazz, r -> {
 			Long roomId = r.getId();
 
+			if (r.getOwnerId() != null) {
+				Long newOwnerId = userMap.get(r.getOwnerId());
+				if (newOwnerId == null) {
+					return; // owner was deleted
+				}
+				r.setOwnerId(newOwnerId);
+			}
 			// We need to reset ids as openJPA reject to store them otherwise
 			r.setId(null);
 			if (r.getModerators() != null) {
@@ -884,6 +891,17 @@ public class BackupImport {
 			}
 			file.setOwnerId(newOwnerId);
 		}
+		if (file.getInsertedBy() != null) {
+			Long newInsertedBy = userMap.get(file.getInsertedBy());
+			file.setInsertedBy(newInsertedBy);
+		}
+		if (file.getGroupId() != null) {
+			Long newGroupId = groupMap.get(file.getGroupId());
+			if (newGroupId == null) {
+				return true; // owner was deleted
+			}
+			file.setGroupId(newGroupId);
+		}
 		return false;
 	}
 
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index e192aa6..47e665d 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -718,7 +718,7 @@
 		</dependency>
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
+			<artifactId>mockito-inline</artifactId>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/OmMenuItem.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/OmMenuItem.java
index 003cf14..0056b8e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/OmMenuItem.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/OmMenuItem.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.web.common.menu;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
 
 import java.util.ArrayList;
@@ -80,24 +81,15 @@ public class OmMenuItem implements INavbarComponent {
 	@Override
 	public AbstractLink create(String markupId) {
 		AbstractLink item;
-		if (Strings.isEmpty(title)) {
-			item = new MenuDivider();
-		} else if (items.isEmpty()) {
-			item = new NavbarAjaxLink<String>(markupId, Model.of(title)) {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				public void onClick(AjaxRequestTarget target) {
-					OmMenuItem.this.onClick(target);
-				}
-			}.setIconType(icon);
+		if (items.isEmpty()) {
+			item = createLink(markupId, true);
 		} else {
 			item = new NavbarDropDownButton(Model.of(title), Model.of(icon)) {
 				private static final long serialVersionUID = 1L;
 
 				@Override
 				protected List<AbstractLink> newSubMenuButtons(String markupId) {
-					return items.stream().map(mItem -> ((OmMenuItem)mItem).create(markupId)).collect(Collectors.toList());
+					return items.stream().map(mItem -> ((OmMenuItem)mItem).createLink(markupId, false)).collect(Collectors.toList());
 				}
 			};
 		}
@@ -106,6 +98,24 @@ public class OmMenuItem implements INavbarComponent {
 		return item;
 	}
 
+	private AbstractLink createLink(String markupId, boolean topLevel) {
+		if (Strings.isEmpty(title)) {
+			return new MenuDivider();
+		}
+		NavbarAjaxLink<String> link = new NavbarAjaxLink<>(markupId, Model.of(title)) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(AjaxRequestTarget target) {
+				OmMenuItem.this.onClick(target);
+			}
+		};
+		if (topLevel) {
+			link.add(AttributeModifier.append(ATTR_CLASS, "nav-link"));
+		}
+		return link.setIconType(icon);
+	}
+
 	@Override
 	public ComponentPosition getPosition() {
 		return ComponentPosition.LEFT; //FIXME TODO
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
index fdf50f9..ea6a345 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
@@ -120,6 +120,7 @@ public class InstallWizard extends BootstrapWizard {
 	private NotificationPanel feedback;
 	private final CompoundPropertyModel<InstallationConfig> model;
 	private final List<Button> buttons = new ArrayList<>(4);
+	private WizardButtonBar btnBar;
 
 	@SpringBean
 	private ImportInitvalues initvalues;
@@ -163,7 +164,7 @@ public class InstallWizard extends BootstrapWizard {
 
 	@Override
 	protected Component newButtonBar(String id) {
-		return new WizardButtonBar(id, this) {
+		btnBar = new WizardButtonBar(id, this) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -222,6 +223,8 @@ public class InstallWizard extends BootstrapWizard {
 				return button;
 			}
 		};
+		btnBar.setOutputMarkupId(true);
+		return btnBar;
 	}
 
 	private abstract class BaseStep extends DynamicWizardStep {
@@ -771,7 +774,7 @@ public class InstallWizard extends BootstrapWizard {
 				stop(target);
 				progressBar.setVisible(false);
 				congrat.show(initDbType != dbType);
-				target.add(container, desc.setVisible(false));
+				target.add(container, desc.setVisible(false), btnBar.setVisible(false));
 			}
 		};
 		private final Label desc = new Label("desc", "");
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
index e102b87..3de3172 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.backup;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
@@ -26,7 +27,11 @@ import java.io.FileInputStream;
 import java.io.InputStream;
 
 import org.apache.openmeetings.db.dao.calendar.MeetingMemberDao;
+import org.apache.openmeetings.db.dao.file.FileItemDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.db.entity.user.User;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,6 +44,8 @@ public class TestImportOld extends AbstractTestImport {
 	private RoomDao roomDao;
 	@Autowired
 	private MeetingMemberDao meetingMemberDao;
+	@Autowired
+	private FileItemDao fileDao;
 
 	@Test
 	public void importOldVersions() {
@@ -84,4 +91,28 @@ public class TestImportOld extends AbstractTestImport {
 			log.debug("... Done.");
 		}
 	}
+
+	/**
+	 * Test for https://issues.apache.org/jira/browse/OPENMEETINGS-2423
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void importJira2423() throws Exception {
+		try (InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/openmeetings/backup/jira2423/backup_2423.zip")) {
+			backupImport.performImport(is, new ProgressHolder());
+
+			Group grp2 = groupDao.get("group2_jira_2423");
+			User usr2 = userDao.getByLogin("testUser2_jira_2423", User.Type.USER, null);
+			assertTrue(usr2.getGroupUsers().stream().filter(gu -> gu.getGroup().getId().equals(grp2.getId())).findFirst().isPresent(), "User2 should belong to group2");
+			roomDao.getMyRooms(usr2.getId(), "bla", "bla1").forEach(r -> {
+				assertTrue(r.getName().contains("user2_jira_2423"));
+			});
+			FileItem f1 = fileDao.getByHash("820b356c-2c96-4634-90c4-3e490432987f");
+			assertEquals(usr2.getId(), f1.getInsertedBy(), "Inserted by is wrong");
+			assertEquals(usr2.getId(), f1.getOwnerId(), "Owner is wrong");
+			FileItem f2 = fileDao.getByHash("7af3f90d-2a8d-44fa-9e0f-79fd87511cc6");
+			assertEquals(grp2.getId(), f2.getGroupId(), "Group is wrong");
+		}
+	}
 }
diff --git a/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/jira2423/backup_2423.zip b/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/jira2423/backup_2423.zip
new file mode 100644
index 0000000..f17518c
Binary files /dev/null and b/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/jira2423/backup_2423.zip differ
diff --git a/pom.xml b/pom.xml
index 8752cdb..23e06e9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -114,7 +114,6 @@
 		<license.excludedScopes>test</license.excludedScopes>
 		<bcprov-jdk15on.version>1.66</bcprov-jdk15on.version>
 		<mockito.version>3.5.10</mockito.version>
-		<powermock.version>2.0.7</powermock.version>
 		<quartz.version>2.3.2</quartz.version>
 		<kurento.version>6.14.0</kurento.version>
 		<!--  Exclude all generated code  -->
@@ -616,7 +615,7 @@
 			</dependency>
 			<dependency>
 				<groupId>org.mockito</groupId>
-				<artifactId>mockito-core</artifactId>
+				<artifactId>mockito-inline</artifactId>
 				<version>${mockito.version}</version>
 				<scope>test</scope>
 			</dependency>
@@ -627,18 +626,6 @@
 				<scope>test</scope>
 			</dependency>
 			<dependency>
-				<groupId>org.powermock</groupId>
-				<artifactId>powermock-module-junit4</artifactId>
-				<version>${powermock.version}</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.powermock</groupId>
-				<artifactId>powermock-api-mockito2</artifactId>
-				<version>${powermock.version}</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
 				<groupId>javax.websocket</groupId>
 				<artifactId>javax.websocket-api</artifactId>
 				<version>1.1</version>
@@ -676,24 +663,13 @@
 			<scope>test</scope>
 		</dependency>
 		<dependency>
-			<groupId>org.junit.vintage</groupId>
-			<artifactId>junit-vintage-engine</artifactId>
-			<version>${junit.version}</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
+			<artifactId>mockito-inline</artifactId>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
-			<groupId>org.powermock</groupId>
-			<artifactId>powermock-module-junit4</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.powermock</groupId>
-			<artifactId>powermock-api-mockito2</artifactId>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-junit-jupiter</artifactId>
 			<scope>test</scope>
 		</dependency>
 		<dependency>