Skip to content

Commit fd8b4c1

Browse files
committed
feat: omit primitive fields by class type #121
Now you can do "without(int.class)" and primitive fields will have their default value.
1 parent ec43922 commit fd8b4c1

File tree

3 files changed

+56
-3
lines changed

3 files changed

+56
-3
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,10 @@ public Annotation[] getFieldAnnotations(Field field) {
7575

7676
public void setField(Field field, Object value) {
7777
try {
78-
field.setAccessible(true);
79-
field.set(instance, value);
78+
if (!field.getType().isPrimitive() || value != null) {
79+
field.setAccessible(true);
80+
field.set(instance, value);
81+
}
8082
} catch (SecurityException e) {
8183
throw new SpecimenException(format("Unable to access field %s on object of type %s", field.getName(), type.getName()), e);
8284
} catch (IllegalAccessException | InaccessibleObjectException e) {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,12 @@ void canOmitPrivateField() {
221221
void canOmitFieldsOfClassByType() {
222222
var fixture = new Fixture(configuration);
223223

224-
TestPrimitive result = fixture.build(TestPrimitive.class).without(String.class).create();
224+
TestPrimitive result = fixture.build(TestPrimitive.class).without(String.class)
225+
.without(int.class).create();
225226

226227
assertThat(result.getHello()).isNull();
228+
assertThat(result.getInteger()).isNotNull();
229+
assertThat(result.getPrimitive()).isZero();
227230
}
228231

229232
@Test

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.assertj.core.api.Assertions.assertThatCode;
2323
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
2424
import static org.mockito.ArgumentMatchers.any;
25+
import static org.mockito.Mockito.doReturn;
2526
import static org.mockito.Mockito.doThrow;
2627
import static org.mockito.Mockito.mock;
2728
import static org.mockito.Mockito.when;
@@ -99,10 +100,55 @@ void omittingDuplicateFields() {
99100
@DisplayName("when setting a field via reflection")
100101
class SetField {
101102

103+
private String stringField;
104+
private int primitiveField;
105+
106+
@DisplayName("an Object field can be set")
107+
@Test
108+
void setObject() throws Exception {
109+
var field = this.getClass().getDeclaredField("stringField");
110+
var sut = new Reflector<>(this, new SpecimenType<>(){});
111+
sut.setField(field, "new value");
112+
113+
assertThat(stringField).isEqualTo("new value");
114+
}
115+
116+
@DisplayName("an Object field can be set to null")
117+
@Test
118+
void setObjectToNull() throws Exception {
119+
stringField = "before";
120+
var field = this.getClass().getDeclaredField("stringField");
121+
var sut = new Reflector<>(this, new SpecimenType<>(){});
122+
sut.setField(field, null);
123+
124+
assertThat(stringField).isNull();
125+
}
126+
127+
@DisplayName("a primitive field can be set")
128+
@Test
129+
void setPrimitiveField() throws Exception {
130+
var field = this.getClass().getDeclaredField("primitiveField");
131+
var sut = new Reflector<>(this, new SpecimenType<>(){});
132+
sut.setField(field, 4);
133+
134+
assertThat(primitiveField).isEqualTo(4);
135+
}
136+
137+
@DisplayName("setting a primitive field to null keeps the default value")
138+
@Test
139+
void setPrimitiveFieldToNull() throws Exception {
140+
var field = this.getClass().getDeclaredField("primitiveField");
141+
var sut = new Reflector<>(this, new SpecimenType<>(){});
142+
sut.setField(field, null);
143+
144+
assertThat(primitiveField).isEqualTo(0);
145+
}
146+
102147
@DisplayName("an IllegalAccessException is turned into a SpecimenException")
103148
@Test
104149
void catchIllegalAccessException() throws Exception {
105150
var mockedField = Mockito.mock(Field.class);
151+
doReturn(this.getClass()).when(mockedField).getType();
106152
var sut = new Reflector<>("", new SpecimenType<>(){});
107153
doThrow(new IllegalAccessException("expected")).when(mockedField).set(any(), any());
108154

@@ -114,6 +160,7 @@ void catchIllegalAccessException() throws Exception {
114160
@Test
115161
void catchSecurityException() {
116162
var mockedField = Mockito.mock(Field.class);
163+
doReturn(this.getClass()).when(mockedField).getType();
117164
var sut = new Reflector<>("", new SpecimenType<>(){});
118165
doThrow(new SecurityException("expected")).when(mockedField).setAccessible(true);
119166
assertThatExceptionOfType(SpecimenException.class)
@@ -124,6 +171,7 @@ void catchSecurityException() {
124171
@Test
125172
void catchInaccessibleObjectException() {
126173
var mockedField = Mockito.mock(Field.class);
174+
doReturn(this.getClass()).when(mockedField).getType();
127175
var sut = new Reflector<>("", new SpecimenType<>(){});
128176
doThrow(new InaccessibleObjectException("expected")).when(mockedField).setAccessible(true);
129177
assertThatExceptionOfType(SpecimenException.class)

0 commit comments

Comments
 (0)