/* * Copyright 2015-2017 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 v1.0 which * accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html */ package org.junit.jupiter.engine.descriptor; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.lang.reflect.Method; import java.util.Optional; import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.extension.TestExtensionContext; import org.junit.jupiter.engine.execution.JupiterEngineExecutionContext; import org.junit.jupiter.engine.execution.ThrowableCollector; import org.junit.platform.engine.UniqueId; import org.junit.platform.engine.support.hierarchical.Node; /** * Unit tests for {@link TestFactoryTestDescriptor}. * * @since 5.0 */ class TestFactoryTestDescriptorTests { private JupiterEngineExecutionContext context; private TestExtensionContext testExtensionContext; private TestFactoryTestDescriptor descriptor; private boolean isClosed; @BeforeEach void before() throws Exception { testExtensionContext = mock(TestExtensionContext.class); isClosed = false; context = new JupiterEngineExecutionContext(null, null).extend().withThrowableCollector( new ThrowableCollector()).withExtensionContext(testExtensionContext).build(); Method testMethod = CustomStreamTestCase.class.getDeclaredMethod("customStream"); descriptor = new TestFactoryTestDescriptor(UniqueId.forEngine("engine"), CustomStreamTestCase.class, testMethod); when(testExtensionContext.getTestMethod()).thenReturn(Optional.of(testMethod)); } @Test void streamsFromTestFactoriesShouldBeClosed() { Stream<DynamicTest> dynamicTestStream = Stream.empty(); prepareMockForTestInstanceWithCustomStream(dynamicTestStream); descriptor.invokeTestMethod(context, mock(Node.DynamicTestExecutor.class)); assertTrue(isClosed); } @Test void streamsFromTestFactoriesShouldBeClosedWhenTheyThrow() { Stream<Integer> integerStream = Stream.of(1, 2); prepareMockForTestInstanceWithCustomStream(integerStream); descriptor.invokeTestMethod(context, mock(Node.DynamicTestExecutor.class)); assertTrue(isClosed); } private void prepareMockForTestInstanceWithCustomStream(Stream<?> stream) { Stream<?> mockStream = stream.onClose(() -> isClosed = true); when(testExtensionContext.getTestInstance()).thenReturn(new CustomStreamTestCase(mockStream)); } private static class CustomStreamTestCase { private final Stream<?> mockStream; CustomStreamTestCase(Stream<?> mockStream) { this.mockStream = mockStream; } @TestFactory Stream<?> customStream() { return mockStream; } } }