Skip to content

Commit a514cf8

Browse files
committed
[Jakarta Cdi] Correctly cast the UnmanagedInstance values
Fixes: #2242
1 parent 609f284 commit a514cf8

File tree

12 files changed

+105
-51
lines changed

12 files changed

+105
-51
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1717

1818
### Fixed
1919
* [Cdi2] Correctly cast the UnmanagedInstance values ([#2242](https://github.com/cucumber/cucumber-jvm/pull/2242), [#2244](https://github.com/cucumber/cucumber-jvm/pull/2244) Daniel Beland)
20+
* [Cdi2] Correctly cast the UnmanagedInstance values ([#2242](https://github.com/cucumber/cucumber-jvm/pull/2242), [#2248](https://github.com/cucumber/cucumber-jvm/pull/2248) Daniel Beland)
2021

2122
## [6.10.0] (2021-02-14)
2223

jakarta-cdi/pom.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100
</dependency>
101101
<dependency>
102102
<groupId>io.cucumber</groupId>
103-
<artifactId>cucumber-junit</artifactId>
103+
<artifactId>cucumber-junit-platform-engine</artifactId>
104104
<scope>test</scope>
105105
</dependency>
106106
<dependency>
@@ -109,8 +109,8 @@
109109
<scope>test</scope>
110110
</dependency>
111111
<dependency>
112-
<groupId>org.junit.vintage</groupId>
113-
<artifactId>junit-vintage-engine</artifactId>
112+
<groupId>org.hamcrest</groupId>
113+
<artifactId>hamcrest-core</artifactId>
114114
<scope>test</scope>
115115
</dependency>
116116
</dependencies>

jakarta-cdi/src/main/java/io/cucumber/jakarta/cdi/CdiJakartaFactory.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ public boolean addClass(final Class<?> clazz) {
5252

5353
@Override
5454
public <T> T getInstance(final Class<T> type) {
55-
final Object instance = standaloneInstances.get(type);
55+
final Unmanaged.UnmanagedInstance<?> instance = standaloneInstances.get(type);
5656
if (instance != null) {
57-
return type.cast(instance);
57+
return type.cast(instance.get());
5858
}
5959
final Instance<T> selected = container.select(type);
6060
if (selected.isUnsatisfied()) {
@@ -69,5 +69,4 @@ public <T> T getInstance(final Class<T> type) {
6969
}
7070
return selected.get();
7171
}
72-
7372
}

jakarta-cdi/src/test/java/io/cucumber/jakarta/cdi/BellyStepDefinitions.java

-18
This file was deleted.

jakarta-cdi/src/test/java/io/cucumber/jakarta/cdi/CdiBellyStepDefinitions.java

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.cucumber.jakarta.cdi;
22

3+
import io.cucumber.jakarta.cdi.example.Belly;
34
import io.cucumber.java.en.Then;
45
import jakarta.enterprise.context.ApplicationScoped;
56
import jakarta.inject.Inject;
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.cucumber.jakarta.cdi;
22

33
import io.cucumber.core.backend.ObjectFactory;
4+
import jakarta.enterprise.context.ApplicationScoped;
5+
import jakarta.enterprise.inject.Vetoed;
46
import org.junit.jupiter.api.Test;
57

68
import static org.hamcrest.MatcherAssert.assertThat;
@@ -9,35 +11,69 @@
911
import static org.hamcrest.core.IsNot.not;
1012
import static org.hamcrest.core.IsNull.notNullValue;
1113
import static org.junit.jupiter.api.Assertions.assertAll;
14+
import static org.junit.jupiter.api.Assertions.assertNotNull;
1215

1316
class CdiJakartaFactoryTest {
1417

15-
@Test
16-
void shouldGiveUsNewInstancesForEachScenario() {
18+
final ObjectFactory factory = new CdiJakartaFactory();
19+
20+
@Vetoed
21+
static class VetoedBean {
22+
23+
}
1724

18-
final ObjectFactory factory = new CdiJakartaFactory();
19-
factory.addClass(BellyStepDefinitions.class);
20-
factory.addClass(CdiBellyStepDefinitions.class);
25+
@Test
26+
void shouldCreateNewInstancesForEachScenario() {
27+
factory.addClass(VetoedBean.class);
2128

2229
// Scenario 1
2330
factory.start();
24-
final BellyStepDefinitions o1 = factory.getInstance(BellyStepDefinitions.class);
25-
final CdiBellyStepDefinitions cdiStep = factory.getInstance(CdiBellyStepDefinitions.class);
26-
assertAll(
27-
// assert that it is is a CDI proxy
28-
() -> assertThat(cdiStep.getClass(), not(is(CdiBellyStepDefinitions.class))),
29-
() -> assertThat(cdiStep.getClass().getSuperclass(), is(CdiBellyStepDefinitions.class)));
31+
VetoedBean a1 = factory.getInstance(VetoedBean.class);
32+
VetoedBean a2 = factory.getInstance(VetoedBean.class);
33+
assertThat(a1, is(equalTo(a2)));
3034
factory.stop();
3135

3236
// Scenario 2
3337
factory.start();
34-
final BellyStepDefinitions o2 = factory.getInstance(BellyStepDefinitions.class);
38+
VetoedBean b1 = factory.getInstance(VetoedBean.class);
3539
factory.stop();
3640

41+
// VetoedBean makes it possible to compare the object outside the
42+
// scenario/application scope
43+
assertAll(
44+
() -> assertThat(a1, is(notNullValue())),
45+
() -> assertThat(a1, is(not(equalTo(b1)))),
46+
() -> assertThat(b1, is(not(equalTo(a1)))));
47+
}
48+
49+
@ApplicationScoped
50+
static class ApplicationScopedBean {
51+
52+
}
53+
54+
@Test
55+
void shouldCreateApplicationScopedInstance() {
56+
factory.addClass(ApplicationScopedBean.class);
57+
factory.start();
58+
ApplicationScopedBean cdiStep = factory.getInstance(ApplicationScopedBean.class);
3759
assertAll(
38-
() -> assertThat(o1, is(notNullValue())),
39-
() -> assertThat(o1, is(not(equalTo(o2)))),
40-
() -> assertThat(o2, is(not(equalTo(o1)))));
60+
// assert that it is is a CDI proxy
61+
() -> assertThat(cdiStep.getClass(), not(is(ApplicationScopedBean.class))),
62+
() -> assertThat(cdiStep.getClass().getSuperclass(), is(ApplicationScopedBean.class)));
63+
factory.stop();
4164
}
4265

66+
@Test
67+
void shouldCreateUnmanagedInstance() {
68+
factory.addClass(UnmanagedBean.class);
69+
factory.start();
70+
assertNotNull(factory.getInstance(UnmanagedBean.class));
71+
UnmanagedBean cdiStep = factory.getInstance(UnmanagedBean.class);
72+
assertThat(cdiStep.getClass(), is(UnmanagedBean.class));
73+
factory.stop();
74+
}
75+
76+
static class UnmanagedBean {
77+
78+
}
4379
}

jakarta-cdi/src/test/java/io/cucumber/jakarta/cdi/RunCucumberTest.java

-9
This file was deleted.

jakarta-cdi/src/test/java/io/cucumber/jakarta/cdi/Belly.java renamed to jakarta-cdi/src/test/java/io/cucumber/jakarta/cdi/example/Belly.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.cucumber.jakarta.cdi;
1+
package io.cucumber.jakarta.cdi.example;
22

33
import jakarta.enterprise.context.ApplicationScoped;
44

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.cucumber.jakarta.cdi.example;
2+
3+
import io.cucumber.java.en.Given;
4+
import io.cucumber.java.en.Then;
5+
import jakarta.enterprise.inject.Vetoed;
6+
import jakarta.inject.Inject;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
10+
@Vetoed
11+
public class BellyStepDefinitions {
12+
13+
@Inject
14+
private Belly belly;
15+
16+
@Given("I have {int} cukes in my belly")
17+
public void haveCukes(int n) {
18+
belly.setCukes(n);
19+
}
20+
21+
@Given("I eat {int} more cukes")
22+
public void addCukes(int n) {
23+
belly.setCukes(belly.getCukes() + n);
24+
}
25+
26+
@Then("there are {int} cukes in my belly")
27+
public void checkCukes(int n) {
28+
assertEquals(n, belly.getCukes());
29+
}
30+
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.cucumber.jakarta.cdi.example;
2+
3+
import io.cucumber.junit.platform.engine.Cucumber;
4+
5+
@Cucumber
6+
public class RunCucumberTest {
7+
8+
}

jakarta-cdi/src/test/resources/META-INF/beans.xml

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,9 @@
33
xsi:schemaLocation="
44
http://java.sun.com/xml/ns/javaee
55
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
6-
6+
<!-- Exclude the class to force it to be loaded as an unmanaged dependency -->
7+
<scan>
8+
<exclude
9+
name="io.cucumber.jakarta.cdi.CdiJakartaFactoryTest$UnmanagedBean" />
10+
</scan>
711
</beans>

jakarta-cdi/src/test/resources/io/cucumber/jakarta/cdi/cukes.feature renamed to jakarta-cdi/src/test/resources/io/cucumber/jakarta/cdi/example/cukes.feature

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ Feature: Cukes
66

77
Scenario: Eat some more cukes
88
Given I have 6 cukes in my belly
9-
Then there are 6 cukes in my belly
9+
And I eat 2 more cukes
10+
Then there are 8 cukes in my belly

0 commit comments

Comments
 (0)