Skip to content

Commit be21697

Browse files
authored
Merge pull request #1804 from geoand/#1749
Allow beans to be injected in tests even if they aren't used in the application
2 parents f222e12 + e278c77 commit be21697

File tree

6 files changed

+100
-0
lines changed

6 files changed

+100
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.quarkus.deployment.builditem;
2+
3+
import org.jboss.builder.item.MultiBuildItem;
4+
5+
/**
6+
* This is an optional build item that allows us to track annotations that will define test classes
7+
* It is only available during tests
8+
*/
9+
public final class TestAnnotationBuildItem extends MultiBuildItem {
10+
11+
private final String annotationClassName;
12+
13+
public TestAnnotationBuildItem(String annotationClassName) {
14+
this.annotationClassName = annotationClassName;
15+
}
16+
17+
public String getAnnotationClassName() {
18+
return annotationClassName;
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.quarkus.arc.deployment;
2+
3+
import java.util.List;
4+
5+
import org.jboss.jandex.DotName;
6+
7+
import io.quarkus.deployment.annotations.BuildProducer;
8+
import io.quarkus.deployment.annotations.BuildStep;
9+
import io.quarkus.deployment.builditem.TestAnnotationBuildItem;
10+
11+
public class TestsAsBeanDefiningAnnotationsProcessor {
12+
13+
@BuildStep
14+
public void produce(List<TestAnnotationBuildItem> items, BuildProducer<BeanDefiningAnnotationBuildItem> producer) {
15+
for (TestAnnotationBuildItem item : items) {
16+
producer.produce(new BeanDefiningAnnotationBuildItem(DotName.createSimple(item.getAnnotationClassName())));
17+
}
18+
}
19+
20+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.quarkus.example.arc;
2+
3+
import javax.enterprise.context.ApplicationScoped;
4+
5+
@ApplicationScoped
6+
public class UnusedBean {
7+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.quarkus.example.test;
2+
3+
import static org.junit.jupiter.api.Assertions.assertNotNull;
4+
5+
import javax.inject.Inject;
6+
7+
import org.junit.jupiter.api.Test;
8+
9+
import io.quarkus.example.arc.UnusedBean;
10+
import io.quarkus.test.junit.QuarkusTest;
11+
12+
@QuarkusTest
13+
class BeanOnlyInTestCase {
14+
15+
@Inject
16+
UnusedBean unusedBean;
17+
18+
@Test
19+
void assertBeanIsInjected() {
20+
assertNotNull(unusedBean);
21+
}
22+
}

test-framework/junit4/src/main/java/io/quarkus/test/junit4/QuarkusTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,16 @@
2020
import static io.quarkus.test.common.PathTestHelper.getTestClassesLocation;
2121

2222
import java.io.IOException;
23+
import java.util.function.Consumer;
2324

25+
import org.jboss.builder.BuildChainBuilder;
26+
import org.jboss.builder.BuildContext;
27+
import org.jboss.builder.BuildStep;
28+
import org.junit.runner.RunWith;
2429
import org.junit.runner.notification.RunNotifier;
2530
import org.junit.runners.model.InitializationError;
2631

32+
import io.quarkus.deployment.builditem.TestAnnotationBuildItem;
2733
import io.quarkus.runner.RuntimeRunner;
2834
import io.quarkus.runtime.LaunchMode;
2935
import io.quarkus.test.common.PropertyTestUtil;
@@ -50,6 +56,18 @@ protected void startQuarkus() {
5056
.setClassLoader(getClass().getClassLoader())
5157
.setTarget(getAppClassLocation(getTestClass()))
5258
.setFrameworkClassesPath(getTestClassesLocation(getTestClass()))
59+
.addChainCustomizer(new Consumer<BuildChainBuilder>() {
60+
@Override
61+
public void accept(BuildChainBuilder buildChainBuilder) {
62+
buildChainBuilder.addBuildStep(new BuildStep() {
63+
@Override
64+
public void execute(BuildContext context) {
65+
context.produce(new TestAnnotationBuildItem(RunWith.class.getName()));
66+
}
67+
}).produces(TestAnnotationBuildItem.class)
68+
.build();
69+
}
70+
})
5371
.build();
5472
runtimeRunner.run();
5573
}

test-framework/junit5/src/main/java/io/quarkus/test/junit/QuarkusTestExtension.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import io.quarkus.bootstrap.util.PropertyUtils;
5757
import io.quarkus.deployment.ClassOutput;
5858
import io.quarkus.deployment.QuarkusClassWriter;
59+
import io.quarkus.deployment.builditem.TestAnnotationBuildItem;
5960
import io.quarkus.deployment.builditem.TestClassPredicateBuildItem;
6061
import io.quarkus.deployment.util.IoUtil;
6162
import io.quarkus.runner.RuntimeRunner;
@@ -243,6 +244,18 @@ public boolean test(String className) {
243244
.build();
244245
}
245246
})
247+
.addChainCustomizer(new Consumer<BuildChainBuilder>() {
248+
@Override
249+
public void accept(BuildChainBuilder buildChainBuilder) {
250+
buildChainBuilder.addBuildStep(new BuildStep() {
251+
@Override
252+
public void execute(BuildContext context) {
253+
context.produce(new TestAnnotationBuildItem(QuarkusTest.class.getName()));
254+
}
255+
}).produces(TestAnnotationBuildItem.class)
256+
.build();
257+
}
258+
})
246259
.build();
247260
runtimeRunner.run();
248261

0 commit comments

Comments
 (0)