Skip to content

Commit 5db2e19

Browse files
committed
feat: add reference implementation
1 parent c999fd4 commit 5db2e19

File tree

5 files changed

+135
-1
lines changed

5 files changed

+135
-1
lines changed

build.gradle

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
plugins {
2+
id 'idea'
23
id 'java'
34
}
45

@@ -10,7 +11,10 @@ repositories {
1011
}
1112

1213
dependencies {
13-
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2'
14+
implementation 'org.junit.jupiter:junit-jupiter-api:5.7.2'
15+
implementation 'com.fasterxml.jackson.core:jackson-core:2.12.5'
16+
implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.5'
17+
1418
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2'
1519
}
1620

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.example;
2+
3+
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Retention;
6+
import java.lang.annotation.RetentionPolicy;
7+
import java.lang.annotation.Target;
8+
9+
@Retention(RetentionPolicy.RUNTIME)
10+
@Target(ElementType.PARAMETER)
11+
public @interface Fixture {
12+
String value();
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package org.example;
2+
3+
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import org.junit.jupiter.api.extension.ExtensionContext;
6+
import org.junit.jupiter.api.extension.ParameterContext;
7+
import org.junit.jupiter.api.extension.ParameterResolutionException;
8+
import org.junit.jupiter.api.extension.ParameterResolver;
9+
10+
import java.io.BufferedReader;
11+
import java.io.IOException;
12+
import java.io.InputStream;
13+
import java.io.InputStreamReader;
14+
15+
public class FixtureParameterResolver implements ParameterResolver {
16+
17+
public static final String BASE_PATH = "/fixtures/%s";
18+
private static final ObjectMapper objectMapper = new ObjectMapper();
19+
20+
@Override
21+
public boolean supportsParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext)
22+
throws ParameterResolutionException {
23+
return parameterContext.getParameter().isAnnotationPresent(Fixture.class);
24+
}
25+
26+
@Override
27+
public Object resolveParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext)
28+
throws ParameterResolutionException {
29+
Fixture fixture = parameterContext.getParameter().getAnnotation(Fixture.class);
30+
31+
final String fileName = fixture.value();
32+
final String filePath = String.format(BASE_PATH, fileName);
33+
final InputStream inputStream = FixtureParameterResolver.class.getResourceAsStream(filePath);
34+
35+
final String data;
36+
37+
try {
38+
data = readFromInputStream(inputStream);
39+
} catch (IOException ex) {
40+
throw new ParameterResolutionException(ex.getMessage(), ex);
41+
}
42+
43+
if (parameterContext.getParameter().getType().isAssignableFrom(String.class)) {
44+
return data.trim();
45+
}
46+
47+
try {
48+
return objectMapper.readValue(data, parameterContext.getParameter().getType());
49+
} catch (JsonProcessingException e) {
50+
throw new ParameterResolutionException(e.getMessage(), e);
51+
}
52+
}
53+
54+
private String readFromInputStream(final InputStream inputStream)
55+
throws IOException {
56+
final StringBuilder resultStringBuilder = new StringBuilder();
57+
58+
try (final BufferedReader br
59+
= new BufferedReader(new InputStreamReader(inputStream))) {
60+
String line;
61+
while ((line = br.readLine()) != null) {
62+
resultStringBuilder.append(line).append("\n");
63+
}
64+
}
65+
66+
return resultStringBuilder.toString();
67+
}
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.example;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.ExtendWith;
7+
8+
@ExtendWith(FixtureParameterResolver.class)
9+
public class FixtureParameterResolverTest {
10+
11+
@Test
12+
void test_fixture_annotation_when_fixtureTypeIsObject(final @Fixture("fixtureTest.json") TestData testData) {
13+
assertEquals(123, testData.getId());
14+
assertEquals("hello world", testData.getTest());
15+
}
16+
17+
@Test
18+
void should_return_helloWorldMessage(final @Fixture("fixtureTest.json") String message) {
19+
assertEquals("{\n" +
20+
" \"id\": 123,\n" +
21+
" \"test\": \"hello world\"\n" +
22+
"}", message);
23+
}
24+
25+
static class TestData {
26+
private int id;
27+
private String test;
28+
29+
public TestData(int id, String test) {
30+
this.id = id;
31+
this.test = test;
32+
}
33+
34+
public TestData() {
35+
}
36+
37+
public int getId() {
38+
return id;
39+
}
40+
41+
public String getTest() {
42+
return test;
43+
}
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"id": 123,
3+
"test": "hello world"
4+
}

0 commit comments

Comments
 (0)