I am trying to write JUnit test for GraphQl with Spring Boot. My test fails at the below method. I am getting AsserException at treeWiring.abcFetcher. (Caused by: graphql.AssertException: you must provide a data fetcher). PLease help me how to mock the data fetcher. Its value is showing as null.
private RuntimeWiring buildWiring() {
return RuntimeWiring.newRuntimeWiring()
.type(newTypeWiring("Query")
.dataFetcher("xList", abcWiring.abcDataFetcher));
Below is my source class
@Component
public class GraphQLProvider {
private GraphQL graphQL;
private TreeWiring abcWiring;
@Autowired
public GraphQLProvider(TreeWiring abcWiring) {
this.abcWiring = abcWiring;
}
@PostConstruct
public void init() throws IOException {
URL url = Resources.getResource("graphql/x.graphqls");
String sdl = Resources.toString(url, Charsets.UTF_8);
GraphQLSchema graphQLSchema = buildSchema(sdl);
Instrumentation instrumentation = new TracingInstrumentation();
DataLoaderRegistry registry = new DataLoaderRegistry();
DataLoaderDispatcherInstrumentation dispatcherInstrumentation
= new DataLoaderDispatcherInstrumentation(registry);
this.graphQL = GraphQL.newGraphQL(graphQLSchema).instrumentation(instrumentation).instrumentation(dispatcherInstrumentation).build();
}
private GraphQLSchema buildSchema(String sdl) {
TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(sdl);
RuntimeWiring runtimeWiring = buildWiring();
SchemaGenerator schemaGenerator = new SchemaGenerator();
return schemaGenerator.makeExecutableSchema(typeRegistry, runtimeWiring);
}
private RuntimeWiring buildWiring() {
return RuntimeWiring.newRuntimeWiring()
.type(newTypeWiring("Query")
.dataFetcher("xList", abcWiring.abcDataFetcher));
Below is my TestCLass:
@ContextConfiguration(classes = GraphQLProvider.class)
@SpringBootTest
@RunWith(SpringRunner.class)
public class GraphQLProviderTest {
@MockBean
TreeWiring treeWiring;
@MockBean
DataFetcher abcDataFetcher;
//@InjectMocks
//GraphQLProvider graphQLProvider = new GraphQLProvider(treeWiring);
@Autowired
@InjectMocks
GraphQLProvider graphQLProvider;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testGetUserLabels() throws IOException {
Mockito.when(treeWiring.db2HealthDataFetcher).thenReturn(db2HealthDataFetcher);
graphQLProvider.init();
}
}
Below is my TreeWiring code:
@Component
public class TreeWiring {
@Autowired
public TreeWiring(OneRepository oneRepository,
TwoRepository twoRepository,
ThreeRepository threeRepository,
FourRepository fourRepository) {
this.oneRepository = oneRepository;
this.twoRepository = twoRepository;
this.threeRepository =threeRepository;
this.fourRepository = fourRepository;
}
DataFetcher abcDataFetcher = environment -> {
String eID = environment.getArgument("eId");
String dID = environment.getArgument("dId");
return oneRepository.getUserLabel(eID);
In your JUnit test class, you are mocking the DataFetcher abcDataFetcher, but you are not setting it up to be used in the TreeWiring class. That's why you are getting a NullPointerException when trying to use it.
To fix this, you need to properly set up the abcDataFetcher mock and pass it to the TreeWiring instance used in your GraphQLProvider. Here's how you can do it:
By properly setting up the abcDataFetcher mock and passing it to the TreeWiring class, the null value issue should be resolved, and your test should run without any NullPointerException.