diff --git a/application-graph/src/main/java/ru/tinkoff/kora/application/graph/ApplicationGraphDraw.java b/application-graph/src/main/java/ru/tinkoff/kora/application/graph/ApplicationGraphDraw.java index b594d98b2..fb2883917 100644 --- a/application-graph/src/main/java/ru/tinkoff/kora/application/graph/ApplicationGraphDraw.java +++ b/application-graph/src/main/java/ru/tinkoff/kora/application/graph/ApplicationGraphDraw.java @@ -8,6 +8,7 @@ import java.util.Collections; import java.util.List; import java.util.TreeMap; +import java.util.stream.Collectors; public class ApplicationGraphDraw { @@ -101,16 +102,20 @@ static void addNode(ApplicationGraphDraw draw, Node node) { return draw; } - public ApplicationGraphDraw subgraph(Node... rootNodes) { + public ApplicationGraphDraw subgraph(List> excludeTransitive, Iterable> rootNodes) { var seen = new TreeMap(); + var excludeTransitiveSet = excludeTransitive.stream().map(n -> n.index).collect(Collectors.toSet()); + var subgraph = new ApplicationGraphDraw(this.root); var visitor = new Object() { public Node accept(Node node) { if (!seen.containsKey(node.index)) { var dependencies = new ArrayList>(); var interceptors = new ArrayList>>(); - for (var dependencyNode : node.getDependencyNodes()) { - dependencies.add(this.accept(dependencyNode)); + if (!excludeTransitiveSet.contains(node.index)) { + for (var dependencyNode : node.getDependencyNodes()) { + dependencies.add(this.accept(dependencyNode)); + } } for (var interceptor : node.getInterceptors()) { interceptors.add(this.accept(interceptor)); diff --git a/application-graph/src/test/java/ru/tinkoff/kora/application/graph/GraphTest.java b/application-graph/src/test/java/ru/tinkoff/kora/application/graph/GraphTest.java index 11a171978..30580b380 100644 --- a/application-graph/src/test/java/ru/tinkoff/kora/application/graph/GraphTest.java +++ b/application-graph/src/test/java/ru/tinkoff/kora/application/graph/GraphTest.java @@ -356,7 +356,7 @@ void graphRefreshCallsRefreshListeners() { @Test void subgraphTest() { var graph = ReferenceGraph.graph(); - var subgraphDraw = graph.draw.subgraph(graph.object4Node); + var subgraphDraw = graph.draw.subgraph(List.of(), List.of(graph.object4Node)); assertThat(subgraphDraw.getNodes()).hasSize(5); var subgraph = subgraphDraw.init().block(); } diff --git a/test/test-junit5/src/main/java/ru/tinkoff/kora/test/extension/junit5/GraphUtils.java b/test/test-junit5/src/main/java/ru/tinkoff/kora/test/extension/junit5/GraphUtils.java index c5b8305ba..6e81c079b 100644 --- a/test/test-junit5/src/main/java/ru/tinkoff/kora/test/extension/junit5/GraphUtils.java +++ b/test/test-junit5/src/main/java/ru/tinkoff/kora/test/extension/junit5/GraphUtils.java @@ -51,7 +51,6 @@ static Set> findNodeByTypeOrAssignable(ApplicationGraphDraw graph, Graph return findNodeByTypeOrAssignable(graph, candidate.type(), candidate.tagsAsArray()); } - @SuppressWarnings("unchecked") static Set> findNodeByTypeOrAssignable(ApplicationGraphDraw graph, Type type, Class[] tags) { if (tags == null || tags.length == 0) { final Set> nodes = new HashSet<>(); diff --git a/test/test-junit5/src/main/java/ru/tinkoff/kora/test/extension/junit5/KoraJUnit5Extension.java b/test/test-junit5/src/main/java/ru/tinkoff/kora/test/extension/junit5/KoraJUnit5Extension.java index 6585b4abb..f183df1a4 100644 --- a/test/test-junit5/src/main/java/ru/tinkoff/kora/test/extension/junit5/KoraJUnit5Extension.java +++ b/test/test-junit5/src/main/java/ru/tinkoff/kora/test/extension/junit5/KoraJUnit5Extension.java @@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory; import reactor.core.publisher.Mono; import ru.tinkoff.kora.application.graph.ApplicationGraphDraw; +import ru.tinkoff.kora.application.graph.Graph; import ru.tinkoff.kora.application.graph.Lifecycle; import ru.tinkoff.kora.application.graph.Node; import ru.tinkoff.kora.common.Component; @@ -48,10 +49,15 @@ static class KoraTestContext { } } + record TestMethodMetadata(TestClassMetadata classMetadata, + Set parameterComponents, + Set parameterMocks) {} + record TestClassMetadata(KoraAppTest annotation, - List fieldsForInjection, Set annotationComponents, + List fieldsForInjection, Set fieldComponents, + Set fieldMocks, Config config) { interface Config { @@ -142,7 +148,7 @@ private static void injectComponentsToFields(TestClassMetadata metadata, TestGra } var testInstance = context.getTestInstance().orElseThrow(() -> new ExtensionConfigurationException("@KoraAppTest can't get TestInstance for @TestComponent field injection")); - for (Field field : metadata.fieldsForInjection) { + for (var field : metadata.fieldsForInjection) { final Class[] tags = parseTags(field); final GraphCandidate candidate = new GraphCandidate(field.getType(), tags); logger.trace("Looking for test method '{}' field '{}' inject candidate: {}", @@ -236,7 +242,8 @@ private static Optional findKoraAppTest(ExtensionContext context) { public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext context) throws ParameterResolutionException { return Arrays.stream(parameterContext.getParameter().getDeclaredAnnotations()) .anyMatch(a -> a.annotationType().equals(TestComponent.class) || a.annotationType().equals(MockComponent.class)) - || parameterContext.getParameter().getType().equals(KoraAppGraph.class); + || parameterContext.getParameter().getType().equals(KoraAppGraph.class) + || parameterContext.getParameter().getType().equals(Graph.class); } @Override @@ -248,9 +255,39 @@ public Object resolveParameter(ParameterContext parameterContext, ExtensionConte return getComponentOrThrow(koraTestContext.graph.initialized(), graphCandidate); } - private static Optional getGraphModification(KoraAppTest koraAppTest, ExtensionContext context) { + private static Optional getGraphModification(ApplicationGraphDraw graphDraw, + TestMethodMetadata metadata, + ExtensionContext context) { final long started = System.nanoTime(); - var mockComponentFromParameters = context.getTestMethod() + var mockComponentFromParameters = metadata.parameterMocks(); + var mockComponentFromFields = metadata.classMetadata().fieldMocks(); + + var mocks = new HashSet<>(mockComponentFromParameters); + mocks.addAll(mockComponentFromFields); + + final KoraGraphModification koraGraphModification = context.getTestInstance() + .filter(inst -> inst instanceof KoraAppTestGraphModifier) + .map(inst -> ((KoraAppTestGraphModifier) inst).graph()) + .map(graph -> { + mocks.forEach(m -> graph.mockComponent(m.candidate().type(), m.candidate().tags())); + return graph; + }) + .orElseGet(() -> { + if (mocks.isEmpty()) { + return null; + } else { + var graph = KoraGraphModification.create(); + mocks.forEach(m -> graph.mockComponent(m.candidate().type(), m.candidate().tags())); + return graph; + } + }); + + logger.debug("@KoraAppTest graph modification collecting took: {}", Duration.ofNanos(System.nanoTime() - started)); + return Optional.ofNullable(koraGraphModification); + } + + private static TestMethodMetadata getMethodMetadata(TestClassMetadata classMetadata, ExtensionContext context) { + var parameterMocks = context.getTestMethod() .filter(method -> !method.isSynthetic()) .stream() .flatMap(m -> Stream.of(m.getParameters())) @@ -263,48 +300,34 @@ private static Optional getGraphModification(KoraAppTest final Class[] tag = parseTags(parameter); return new GraphMock(new GraphCandidate(parameter.getParameterizedType(), tag)); }) - .toList(); + .collect(Collectors.toSet()); - if (koraAppTest.initializeMode() == InitializeMode.PER_CLASS && !mockComponentFromParameters.isEmpty()) { + if (classMetadata.annotation().initializeMode() == InitializeMode.PER_CLASS && !parameterMocks.isEmpty()) { throw new ExtensionConfigurationException("@KoraAppTest when run in 'InitializeMode.PER_CLASS' test can't inject @MockComponent in method parameters"); } - var testInstance = context.getTestInstance().orElseThrow(() -> new ExtensionConfigurationException("@KoraAppTest can't get TestInstance for @TestComponent field injection")); - var mockComponentFromFields = ReflectionUtils.findFields(testInstance.getClass(), - f -> !f.isSynthetic() && !Modifier.isFinal(f.getModifiers()) && !Modifier.isStatic(f.getModifiers()) && f.getAnnotation(MockComponent.class) != null, - ReflectionUtils.HierarchyTraversalMode.TOP_DOWN) - .stream() - .map(field -> { - if (KoraAppGraph.class.isAssignableFrom(field.getType())) { - throw new ExtensionConfigurationException("KoraAppGraph can't be target of @MockComponent"); + final Set parameterComponents = new HashSet<>(); + if (classMetadata.annotation.initializeMode() == KoraAppTest.InitializeMode.PER_METHOD) { + for (var parameter : context.getRequiredTestMethod().getParameters()) { + if (parameter.isAnnotationPresent(TestComponent.class)) { + var tag = parseTags(parameter); + var type = parameter.getParameterizedType(); + parameterComponents.add(new GraphCandidate(type, tag)); } - - final Class[] tag = parseTags(field); - return new GraphMock(new GraphCandidate(field.getGenericType(), tag)); - }) - .toList(); - - final KoraGraphModification koraGraphModification = context.getTestInstance() - .filter(inst -> inst instanceof KoraAppTestGraphModifier) - .map(inst -> ((KoraAppTestGraphModifier) inst).graph()) - .map(graph -> { - mockComponentFromFields.forEach(m -> graph.mockComponent(m.candidate().type(), m.candidate().tags())); - mockComponentFromParameters.forEach(m -> graph.mockComponent(m.candidate().type(), m.candidate().tags())); - return graph; - }) - .orElseGet(() -> { - if (mockComponentFromFields.isEmpty() && mockComponentFromParameters.isEmpty()) { - return null; - } else { - var graph = KoraGraphModification.create(); - mockComponentFromFields.forEach(m -> graph.mockComponent(m.candidate().type(), m.candidate().tags())); - mockComponentFromParameters.forEach(m -> graph.mockComponent(m.candidate().type(), m.candidate().tags())); - return graph; + } + } else if (classMetadata.annotation.initializeMode() == KoraAppTest.InitializeMode.PER_CLASS) { + for (var method : context.getRequiredTestClass().getDeclaredMethods()) { + for (var parameter : method.getParameters()) { + if (parameter.isAnnotationPresent(TestComponent.class)) { + var tag = parseTags(parameter); + var type = parameter.getParameterizedType(); + parameterComponents.add(new GraphCandidate(type, tag)); + } } - }); + } + } - logger.debug("@KoraAppTest graph modification collecting took: {}", Duration.ofNanos(System.nanoTime() - started)); - return Optional.ofNullable(koraGraphModification); + return new TestMethodMetadata(classMetadata, parameterComponents, parameterMocks); } private static TestClassMetadata getClassMetadata(KoraAppTest koraAppTest, ExtensionContext context) { @@ -327,16 +350,24 @@ private static TestClassMetadata getClassMetadata(KoraAppTest koraAppTest, Exten f -> !f.isSynthetic() && (f.getAnnotation(TestComponent.class) != null || f.getAnnotation(MockComponent.class) != null), ReflectionUtils.HierarchyTraversalMode.TOP_DOWN); - final Set fieldCandidates = fieldsForInjection.stream() + final Set fieldComponents = fieldsForInjection.stream() .filter(f -> f.getAnnotation(TestComponent.class) != null) .map(field -> { final Class[] tags = parseTags(field); - return new GraphCandidate(field.getType(), tags); + return new GraphCandidate(field.getGenericType(), tags); + }) + .collect(Collectors.toSet()); + + final Set fieldMocks = fieldsForInjection.stream() + .filter(f -> f.getAnnotation(MockComponent.class) != null) + .map(field -> { + final Class[] tags = parseTags(field); + return new GraphMock(new GraphCandidate(field.getGenericType(), tags)); }) .collect(Collectors.toSet()); logger.debug("@KoraAppTest metadata collecting took: {}", Duration.ofNanos(System.nanoTime() - started)); - return new TestClassMetadata(koraAppTest, fieldsForInjection, annotationCandidates, fieldCandidates, koraAppConfig); + return new TestClassMetadata(koraAppTest, annotationCandidates, fieldsForInjection, fieldComponents, fieldMocks, koraAppConfig); } private static GraphCandidate getGraphCandidate(ParameterContext parameterContext) { @@ -373,6 +404,9 @@ private static Optional getComponentFromGraph(TestGraphInitialized graph if (KoraAppGraph.class.equals(candidate.type())) { return Optional.of(graph.koraAppGraph()); } + if (Graph.class.equals(candidate.type())) { + return Optional.of(graph.refreshableGraph()); + } if (candidate.tags().isEmpty()) { return Optional.ofNullable(graph.graphDraw().findNodeByType(candidate.type())) @@ -413,36 +447,16 @@ private static Optional getComponentFromGraph(TestGraphInitialized graph } } - private static Set scanGraphRoots(TestClassMetadata metadata, ExtensionContext context) { - final Set roots = new HashSet<>(metadata.annotationComponents); - roots.addAll(metadata.fieldComponents); - - if (metadata.annotation.initializeMode() == KoraAppTest.InitializeMode.PER_METHOD) { - for (var parameter : context.getRequiredTestMethod().getParameters()) { - if (parameter.isAnnotationPresent(TestComponent.class)) { - var tag = parseTags(parameter); - var type = parameter.getParameterizedType(); - roots.add(new GraphCandidate(type, tag)); - } - } - } else if (metadata.annotation.initializeMode() == KoraAppTest.InitializeMode.PER_CLASS) { - for (var method : context.getRequiredTestClass().getDeclaredMethods()) { - for (var parameter : method.getParameters()) { - if (parameter.isAnnotationPresent(TestComponent.class)) { - var tag = parseTags(parameter); - var type = parameter.getParameterizedType(); - roots.add(new GraphCandidate(type, tag)); - } - } - } - } - + private static Set scanGraphRoots(TestMethodMetadata metadata, ExtensionContext context) { + final Set roots = new HashSet<>(metadata.classMetadata.annotationComponents); + roots.addAll(metadata.classMetadata.fieldComponents); + roots.addAll(metadata.parameterComponents); return roots; } @SuppressWarnings("unchecked") - private static TestGraph generateTestGraph(TestClassMetadata metadata, ExtensionContext context) { - var applicationClass = metadata.annotation.value(); + private static TestGraph generateTestGraph(TestClassMetadata classMetadata, ExtensionContext context) { + var applicationClass = classMetadata.annotation.value(); var graphSupplier = GRAPH_SUPPLIER_MAP.computeIfAbsent(applicationClass, k -> { try { final long startedLoading = System.nanoTime(); @@ -458,25 +472,41 @@ private static TestGraph generateTestGraph(TestClassMetadata metadata, Extension } }); - final long startedSubgraph = System.nanoTime(); - final ApplicationGraphDraw graphDraw = graphSupplier.get().copy(); + var startedSubgraph = System.nanoTime(); + var methodMetadata = getMethodMetadata(classMetadata, context); + var graphDraw = graphSupplier.get().copy(); - final Set roots = scanGraphRoots(metadata, context); - final Node[] nodesForSubGraph = roots.stream() + var roots = scanGraphRoots(methodMetadata, context); + var nodesForSubGraph = roots.stream() .flatMap(component -> GraphUtils.findNodeByTypeOrAssignable(graphDraw, component).stream()) - .toArray(Node[]::new); - - final ApplicationGraphDraw subGraph = (nodesForSubGraph.length == 0) - ? graphDraw - : graphDraw.subgraph(nodesForSubGraph); + .collect(Collectors.toSet()); + var mocks = new ArrayList>(); + for (var fieldMock : classMetadata.fieldMocks) { + var mockCandidates = GraphUtils.findNodeByTypeOrAssignable(graphDraw, fieldMock.candidate()); + mocks.addAll(mockCandidates); + } + for (var parameterMocks : methodMetadata.parameterMocks) { + var mockCandidates = GraphUtils.findNodeByTypeOrAssignable(graphDraw, parameterMocks.candidate()); + mocks.addAll(mockCandidates); + } + final ApplicationGraphDraw subGraph; + if (nodesForSubGraph.isEmpty()) { + if (mocks.isEmpty()) { + subGraph = graphDraw; + } else { + subGraph = graphDraw.subgraph(mocks, graphDraw.getNodes()); + } + } else { + subGraph = graphDraw.subgraph(mocks, nodesForSubGraph); + } - getGraphModification(metadata.annotation, context).ifPresent(koraGraphModification -> { + getGraphModification(graphDraw, methodMetadata, context).ifPresent(koraGraphModification -> { for (GraphModification modification : koraGraphModification.getModifications()) { modification.accept(subGraph); } }); logger.debug("@KoraAppTest subgraph took: {}", Duration.ofNanos(System.nanoTime() - startedSubgraph)); - return new TestGraph(subGraph, metadata); + return new TestGraph(subGraph, classMetadata); } } diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/add/AddComponentWithGraphTests.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/add/AddComponentWithGraphTests.java index 457f18e01..02f49506d 100644 --- a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/add/AddComponentWithGraphTests.java +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/add/AddComponentWithGraphTests.java @@ -19,6 +19,10 @@ @KoraAppTest(TestApplication.class) public class AddComponentWithGraphTests implements KoraAppTestGraphModifier { + @Tag(LifecycleComponent.class) + @TestComponent + private TestComponent2 component2; + @Override public @NotNull KoraGraphModification graph() { return KoraGraphModification.create() diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/initializemode/PerClassTests.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/initializemode/PerClassTests.java index 5e8542a23..ccadb1f32 100644 --- a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/initializemode/PerClassTests.java +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/initializemode/PerClassTests.java @@ -7,10 +7,13 @@ import ru.tinkoff.kora.test.extension.junit5.KoraAppGraph; import ru.tinkoff.kora.test.extension.junit5.KoraAppTest; import ru.tinkoff.kora.test.extension.junit5.testdata.TestApplication; +import ru.tinkoff.kora.test.extension.junit5.testdata.TestComponent12; import static org.junit.jupiter.api.Assertions.*; -@KoraAppTest(value = TestApplication.class, initializeMode = KoraAppTest.InitializeMode.PER_CLASS) +@KoraAppTest(value = TestApplication.class, + initializeMode = KoraAppTest.InitializeMode.PER_CLASS, +components = TestComponent12.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) class PerClassTests { diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/initializemode/PerMethodTests.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/initializemode/PerMethodTests.java index 8629cc4c3..e32e73401 100644 --- a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/initializemode/PerMethodTests.java +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/initializemode/PerMethodTests.java @@ -7,11 +7,12 @@ import ru.tinkoff.kora.test.extension.junit5.KoraAppGraph; import ru.tinkoff.kora.test.extension.junit5.KoraAppTest; import ru.tinkoff.kora.test.extension.junit5.testdata.TestApplication; +import ru.tinkoff.kora.test.extension.junit5.testdata.TestComponent12; import static org.junit.jupiter.api.Assertions.*; // Per Method by Default -@KoraAppTest(TestApplication.class) +@KoraAppTest(value = TestApplication.class, components = TestComponent12.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class PerMethodTests { diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/inject/InjectFieldTests.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/inject/InjectFieldTests.java index 205df211b..cff97644f 100644 --- a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/inject/InjectFieldTests.java +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/inject/InjectFieldTests.java @@ -24,11 +24,6 @@ void afterEach(@TestComponent TestComponent1 component1) { assertEquals("1", component1.get()); } - @Test - void empty() { - // do nothing - } - @Test void injectOne(@TestComponent TestComponent1 component1) { assertEquals("1", component1.get()); diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/inject/InjectParameterGraphTests.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/inject/InjectParameterGraphTests.java index a8fccb6a8..47c82dc33 100644 --- a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/inject/InjectParameterGraphTests.java +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/inject/InjectParameterGraphTests.java @@ -4,10 +4,11 @@ import ru.tinkoff.kora.test.extension.junit5.KoraAppGraph; import ru.tinkoff.kora.test.extension.junit5.KoraAppTest; import ru.tinkoff.kora.test.extension.junit5.testdata.TestApplication; +import ru.tinkoff.kora.test.extension.junit5.testdata.TestComponent2; import static org.junit.jupiter.api.Assertions.assertNotNull; -@KoraAppTest(TestApplication.class) +@KoraAppTest(value = TestApplication.class, components = TestComponent2.class) public class InjectParameterGraphTests { @Test diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockGraphAddedTests.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockGraphAddedTests.java index beebe5216..b2c6ed0c5 100644 --- a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockGraphAddedTests.java +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockGraphAddedTests.java @@ -11,7 +11,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; -@KoraAppTest(TestApplication.class) +@KoraAppTest(value = TestApplication.class, components = {TestComponent12.class, TestComponent23.class}) public class MockGraphAddedTests { @Test diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockGraphReplacedTests.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockGraphReplacedTests.java index fb7331bba..73372887e 100644 --- a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockGraphReplacedTests.java +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockGraphReplacedTests.java @@ -11,7 +11,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; -@KoraAppTest(TestApplication.class) +@KoraAppTest(value = TestApplication.class, components = {TestComponent12.class, TestComponent23.class}) public class MockGraphReplacedTests { @Test diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockNodeWithSubnodesTests.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockNodeWithSubnodesTests.java new file mode 100644 index 000000000..a58fa1586 --- /dev/null +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockNodeWithSubnodesTests.java @@ -0,0 +1,43 @@ +package ru.tinkoff.kora.test.extension.junit5.mock; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import ru.tinkoff.kora.application.graph.Graph; +import ru.tinkoff.kora.test.extension.junit5.KoraAppTest; +import ru.tinkoff.kora.test.extension.junit5.MockComponent; +import ru.tinkoff.kora.test.extension.junit5.TestComponent; +import ru.tinkoff.kora.test.extension.junit5.testdata.TestApplication; +import ru.tinkoff.kora.test.extension.junit5.testdata.TestComponent333; +import ru.tinkoff.kora.test.extension.junit5.testdata.TestComponent3333; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +@KoraAppTest(TestApplication.class) +public class MockNodeWithSubnodesTests { + + @MockComponent + private TestComponent333 mock; + @TestComponent + private TestComponent3333 bean; + + @BeforeEach + void setupMocks() { + assertNull(mock.get()); + Mockito.when(mock.get()).thenReturn("??"); + } + + @Test + void fieldMocked(Graph graph) { + assertEquals("??", mock.get()); + assertEquals(2, graph.draw().size()); + } + + @Test + void fieldMockedAndInBeanDependency(Graph graph) { + assertEquals("??", mock.get()); + assertEquals("??3", bean.get()); + assertEquals(2, graph.draw().size()); + } +} diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockParametersTests.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockParametersTests.java index c2690fa8b..67d32d93e 100644 --- a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockParametersTests.java +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/mock/MockParametersTests.java @@ -12,7 +12,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; -@KoraAppTest(TestApplication.class) +@KoraAppTest(value = TestApplication.class, components = TestComponent12.class) public class MockParametersTests { @Test diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent3.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent3.java new file mode 100644 index 000000000..441f16f90 --- /dev/null +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent3.java @@ -0,0 +1,19 @@ +package ru.tinkoff.kora.test.extension.junit5.testdata; + +import reactor.core.publisher.Mono; +import ru.tinkoff.kora.common.Component; +import ru.tinkoff.kora.common.annotation.Root; + +@Root +@Component +public class TestComponent3 implements LifecycleComponent { + + public String get() { + return "3"; + } + + @Override + public Mono init() { + return Mono.error(() -> new IllegalStateException("OPS")); + } +} diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent33.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent33.java new file mode 100644 index 000000000..e733e586a --- /dev/null +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent33.java @@ -0,0 +1,19 @@ +package ru.tinkoff.kora.test.extension.junit5.testdata; + +import ru.tinkoff.kora.common.Component; +import ru.tinkoff.kora.common.annotation.Root; + +@Root +@Component +public class TestComponent33 implements LifecycleComponent { + + private final TestComponent3 component3; + + public TestComponent33(TestComponent3 component3) { + this.component3 = component3; + } + + public String get() { + return component3.get() + "3"; + } +} diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent333.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent333.java new file mode 100644 index 000000000..c56fdd1cc --- /dev/null +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent333.java @@ -0,0 +1,19 @@ +package ru.tinkoff.kora.test.extension.junit5.testdata; + +import ru.tinkoff.kora.common.Component; +import ru.tinkoff.kora.common.annotation.Root; + +@Root +@Component +public class TestComponent333 implements LifecycleComponent { + + private final TestComponent33 component33; + + public TestComponent333(TestComponent33 component33) { + this.component33 = component33; + } + + public String get() { + return component33.get() + "3"; + } +} diff --git a/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent3333.java b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent3333.java new file mode 100644 index 000000000..3dcb6369a --- /dev/null +++ b/test/test-junit5/src/test/java/ru/tinkoff/kora/test/extension/junit5/testdata/TestComponent3333.java @@ -0,0 +1,19 @@ +package ru.tinkoff.kora.test.extension.junit5.testdata; + +import ru.tinkoff.kora.common.Component; +import ru.tinkoff.kora.common.annotation.Root; + +@Root +@Component +public class TestComponent3333 implements LifecycleComponent { + + private final TestComponent333 component333; + + public TestComponent3333(TestComponent333 component333) { + this.component333 = component333; + } + + public String get() { + return component333.get() + "3"; + } +}