diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListener.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListener.java index a79f93f8cfee..ac538accdf7f 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListener.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListener.java @@ -10,6 +10,8 @@ package org.junit.platform.launcher.listeners.session; +import static org.junit.platform.commons.util.CollectionUtils.forEachInReverseOrder; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -36,6 +38,6 @@ public void launcherSessionOpened(LauncherSession session) { @Override public void launcherSessionClosed(LauncherSession session) { - listeners.forEach(delegate -> delegate.launcherSessionClosed(session)); + forEachInReverseOrder(listeners, delegate -> delegate.launcherSessionClosed(session)); } } diff --git a/platform-tests/src/test/java/org/junit/platform/launcher/core/LauncherSessionTests.java b/platform-tests/src/test/java/org/junit/platform/launcher/core/LauncherSessionTests.java index 9cc2063d9b9f..761eba797723 100644 --- a/platform-tests/src/test/java/org/junit/platform/launcher/core/LauncherSessionTests.java +++ b/platform-tests/src/test/java/org/junit/platform/launcher/core/LauncherSessionTests.java @@ -26,8 +26,8 @@ class LauncherSessionTests { - LauncherSessionListener firstSessionListener = mock(LauncherSessionListener.class); - LauncherSessionListener secondSessionListener = mock(LauncherSessionListener.class); + LauncherSessionListener firstSessionListener = mock(LauncherSessionListener.class, "firstSessionListener"); + LauncherSessionListener secondSessionListener = mock(LauncherSessionListener.class, "secondSessionListener"); LauncherConfig launcherConfig = createLauncherConfigBuilderWithDisabledServiceLoading() // .addLauncherSessionListeners(firstSessionListener, secondSessionListener) // .addTestEngines(new TestEngineStub()) // @@ -44,22 +44,22 @@ void callsRegisteredListenersWhenLauncherIsUsedDirectly() { var launcherSession = ArgumentCaptor.forClass(LauncherSession.class); inOrder.verify(firstSessionListener).launcherSessionOpened(launcherSession.capture()); inOrder.verify(secondSessionListener).launcherSessionOpened(launcherSession.getValue()); - inOrder.verify(firstSessionListener).launcherSessionClosed(launcherSession.getValue()); inOrder.verify(secondSessionListener).launcherSessionClosed(launcherSession.getValue()); + inOrder.verify(firstSessionListener).launcherSessionClosed(launcherSession.getValue()); launcher.execute(testPlan); inOrder.verify(firstSessionListener).launcherSessionOpened(launcherSession.capture()); inOrder.verify(secondSessionListener).launcherSessionOpened(launcherSession.getValue()); - inOrder.verify(firstSessionListener).launcherSessionClosed(launcherSession.getValue()); inOrder.verify(secondSessionListener).launcherSessionClosed(launcherSession.getValue()); + inOrder.verify(firstSessionListener).launcherSessionClosed(launcherSession.getValue()); launcher.execute(request); inOrder.verify(firstSessionListener).launcherSessionOpened(launcherSession.capture()); inOrder.verify(secondSessionListener).launcherSessionOpened(launcherSession.getValue()); - inOrder.verify(firstSessionListener).launcherSessionClosed(launcherSession.getValue()); inOrder.verify(secondSessionListener).launcherSessionClosed(launcherSession.getValue()); + inOrder.verify(firstSessionListener).launcherSessionClosed(launcherSession.getValue()); } @Test @@ -87,8 +87,8 @@ void callsRegisteredListenersWhenLauncherIsUsedViaSession() { session.close(); - inOrder.verify(firstSessionListener).launcherSessionClosed(session); inOrder.verify(secondSessionListener).launcherSessionClosed(session); + inOrder.verify(firstSessionListener).launcherSessionClosed(session); verifyNoMoreInteractions(firstSessionListener, secondSessionListener); } diff --git a/platform-tests/src/test/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListenerTests.java b/platform-tests/src/test/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListenerTests.java new file mode 100644 index 000000000000..ecfcfa215d4d --- /dev/null +++ b/platform-tests/src/test/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListenerTests.java @@ -0,0 +1,42 @@ +/* + * Copyright 2015-2023 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * https://www.eclipse.org/legal/epl-v20.html + */ + +package org.junit.platform.launcher.listeners.session; + +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.junit.platform.launcher.LauncherSession; +import org.junit.platform.launcher.LauncherSessionListener; +import org.mockito.InOrder; + +public class CompositeLauncherSessionListenerTests { + + @Test + void callsListenersInReverseOrderForClosedEvents() { + var firstListener = mock(LauncherSessionListener.class, "firstListener"); + var secondListener = mock(LauncherSessionListener.class, "secondListener"); + + var launcherSession = mock(LauncherSession.class); + + var composite = new CompositeLauncherSessionListener(List.of(firstListener, secondListener)); + composite.launcherSessionOpened(launcherSession); + composite.launcherSessionClosed(launcherSession); + + InOrder inOrder = inOrder(firstListener, secondListener); + inOrder.verify(firstListener).launcherSessionOpened(launcherSession); + inOrder.verify(secondListener).launcherSessionOpened(launcherSession); + inOrder.verify(secondListener).launcherSessionClosed(launcherSession); + inOrder.verify(firstListener).launcherSessionClosed(launcherSession); + } +}