我正在使用Java Sping Boot 3.2.0和GraphQL。对于我的几个GraphQL API,我需要接触不同的客户端来获取数据。我有一个GraphQL控制器,一个服务类和一个客户端类用于该流。
控制器是我的GraphQL查询的入口点,服务类将处理查询所需的特定逻辑。服务类将调用客户端类,客户端类将处理与特定客户端联系获取数据的工作。我现在拥有的一切都是最基本的,但流程将保持不变。
我不关心测试客户端类,但我想测试我的控制器和服务类。然而,我不确定如何在使用GraphQlTester时模拟从客户端类返回的数据。
以下是课程:
控制器类
@Controller
public class CustomerController {
private final CustomerService service;
public CustomerController(CustomerService service) {
this.service = service;
}
@QueryMapping
public List<Customer> queryCustomer(@Argument Long customerId) {
return service.queryCustomer(customerId);
}
}
字符串
服务类
@Component
public class CustomerService {
private final MyClient myClient;
public CustomerService(MyClient myClient) {
this.myClient = myClient;
}
/***
* Contains logic to query the appropriate client(s) for the Customer data.
*
* @param customerId the unique ID of the Customer
*
* @return List of Customers for the input customerId
*/
public List<Customer> queryCustomer(Long customerId) {
return myClient.getCustomerData(customerId);
}
}
型
客户端类
@Component
public class MyClient {
public List<Customer> getCustomerData(Long customerId) {
throw new NotImplementedException("This API is not yet implemented.");
}
}
型
我使用GraphQlTester来帮助测试,但我希望能够从MyClient返回模拟数据,而不是让客户端实际获取数据(此外,该类尚未完全实现,所以现在只是抛出一个异常......我不希望在我的测试中发生)
下面是测试类:
@Import({CustomerService.class, MyClient.class})
@GraphQlTest(CustomerController.class)
class CustomerControllerTest {
@Autowired
GraphQlTester graphQlTester;
@Test
void testQueryCustomer() {
List<Customer> mockList = new ArrayList<>();
mockList.add(new Customer(1234L, "[email protected]", "FirstName", "LastName"));
MyClient myClient = mock(MyClient.class);
when(myClient.getCustomerData(1234L)).thenReturn(mockList);
graphQlTester.documentName("queryCustomerTest")
.execute()
.path("queryCustomer")
.entityList(Customer.class)
.satisfies(customers -> {
assertEquals(customers.size(), 1);
});
}
}
型
我的GraphQL文档
query queryCustomer($customerId: ID) {
queryCustomer(customerId: $customerId)
{
customerId
customerEmail
firstName
lastName
}
}
型
客户记录
public record Customer(
Long customerId,
String customerEmail,
String fistName,
String lastName
) {
}
型
现在,我意识到我的mock目前不能以这种方式工作,因为当我执行测试时,我仍然会返回异常:
java.lang.AssertionError: Response has 1 unexpected error(s) of 1 total. If expected, please filter them out: [[NotImplementedException]: This API is not yet implemented.]
型
我知道我可以过滤掉预期的错误,但我宁愿模拟数据被返回。我如何注入我的模拟数据返回时,MyClient.getCustomerData()被调用?谢谢!
1条答案
按热度按时间kx1ctssn1#
把它弄出来。而不是使用:
字符串
我不得不像这样添加MockBean:
型