Skip to content

Commit 043373e

Browse files
committed
fix: create subclass of collection as proxy
This is necessary, because Fixture cannot create instances of non- vanilla collections. Refs: #114
1 parent 9ac9722 commit 043373e

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

src/main/java/com/github/nylle/javafixture/SpecimenType.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,27 @@
1212
import java.time.temporal.Temporal;
1313
import java.time.temporal.TemporalAdjuster;
1414
import java.time.temporal.TemporalAmount;
15+
import java.util.ArrayDeque;
16+
import java.util.ArrayList;
1517
import java.util.Collection;
18+
import java.util.Deque;
19+
import java.util.EnumSet;
20+
import java.util.HashSet;
21+
import java.util.LinkedList;
1622
import java.util.List;
1723
import java.util.Map;
24+
import java.util.NavigableSet;
1825
import java.util.Objects;
26+
import java.util.Queue;
27+
import java.util.Set;
28+
import java.util.SortedSet;
29+
import java.util.TreeSet;
30+
import java.util.concurrent.BlockingDeque;
31+
import java.util.concurrent.BlockingQueue;
32+
import java.util.concurrent.LinkedBlockingDeque;
33+
import java.util.concurrent.LinkedBlockingQueue;
34+
import java.util.concurrent.LinkedTransferQueue;
35+
import java.util.concurrent.TransferQueue;
1936
import java.util.function.Function;
2037
import java.util.stream.Collectors;
2138
import java.util.stream.IntStream;
@@ -138,7 +155,30 @@ public boolean isParameterized() {
138155
}
139156

140157
public boolean isCollection() {
141-
return Collection.class.isAssignableFrom(asClass());
158+
if(!isInterface() && !isAbstract()) {
159+
return Collection.class.isAssignableFrom(asClass());
160+
}
161+
162+
return Stream.of(Collection.class,
163+
List.class,
164+
NavigableSet.class,
165+
SortedSet.class,
166+
Set.class,
167+
EnumSet.class,
168+
Deque.class,
169+
BlockingDeque.class,
170+
Queue.class,
171+
BlockingQueue.class,
172+
TransferQueue.class,
173+
ArrayList.class,
174+
HashSet.class,
175+
TreeSet.class,
176+
ArrayDeque.class,
177+
LinkedBlockingDeque.class,
178+
LinkedList.class,
179+
LinkedBlockingQueue.class,
180+
LinkedTransferQueue.class)
181+
.anyMatch(x -> asClass().isAssignableFrom(x));
142182
}
143183

144184
public boolean isMap() {

src/test/java/com/github/nylle/javafixture/FixtureTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.github.nylle.javafixture.testobjects.ITestGeneric;
44
import com.github.nylle.javafixture.testobjects.ITestGenericInside;
5+
import com.github.nylle.javafixture.testobjects.TestCollectionExtension;
56
import com.github.nylle.javafixture.testobjects.TestEnum;
67
import com.github.nylle.javafixture.testobjects.TestObject;
78
import com.github.nylle.javafixture.testobjects.TestObjectGeneric;
@@ -26,6 +27,8 @@
2627
import org.junit.jupiter.api.Nested;
2728
import org.junit.jupiter.api.Test;
2829

30+
import javassist.util.proxy.Proxy;
31+
2932
import java.io.File;
3033
import java.time.Instant;
3134
import java.time.LocalDate;
@@ -570,6 +573,16 @@ void createExceptionWithLimitedTree() {
570573
.doesNotThrowAnyException();
571574
}
572575

576+
@Test
577+
void createSubclassOfCollectionAsProxyBecauseFixtureCannotCreateAnInstanceOfANonVanillaCollection() {
578+
var sut = new Fixture(configuration);
579+
580+
var result = sut.create(new SpecimenType<TestCollectionExtension<String>>() {});
581+
582+
assertThat(result).isInstanceOf(TestCollectionExtension.class);
583+
assertThat(Proxy.class.isAssignableFrom(result.getClass())).isTrue();
584+
}
585+
573586
private Stream<Throwable> flattenRecursively(Throwable throwable) {
574587
return Stream.of(throwable.getSuppressed()).flatMap(x -> flattenRecursively(x));
575588
}

src/test/java/com/github/nylle/javafixture/SpecimenTypeTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.github.nylle.javafixture.testobjects.ClassWithBuilder;
77
import com.github.nylle.javafixture.testobjects.ITestGeneric;
88
import com.github.nylle.javafixture.testobjects.TestAbstractClass;
9+
import com.github.nylle.javafixture.testobjects.TestCollectionExtension;
910
import com.github.nylle.javafixture.testobjects.TestEnum;
1011
import com.github.nylle.javafixture.testobjects.TestObject;
1112
import com.github.nylle.javafixture.testobjects.TestObjectGeneric;
@@ -111,6 +112,7 @@ void isCollection() {
111112
assertThat(new SpecimenType<LinkedList<String>>() {}.isCollection()).isTrue();
112113
assertThat(new SpecimenType<LinkedBlockingQueue<String>>() {}.isCollection()).isTrue();
113114
assertThat(new SpecimenType<LinkedTransferQueue<String>>() {}.isCollection()).isTrue();
115+
assertThat(new SpecimenType<TestCollectionExtension<String>>() {}.isCollection()).isFalse();
114116
}
115117

116118
@TestWithCases
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.github.nylle.javafixture.testobjects;
2+
3+
import java.util.Collection;
4+
5+
public interface TestCollectionExtension<T> extends Collection<T> {
6+
int customMethod();
7+
}

0 commit comments

Comments
 (0)