mockito 在测试中使用GraphQlTester时模拟来自方法的数据

zwghvu4y  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(113)

我正在使用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()被调用?谢谢!

kx1ctssn

kx1ctssn1#

把它弄出来。而不是使用:

MyClient myClient = mock(MyClient.class);

字符串
我不得不像这样添加MockBean:

@MockBean
    MyClient myClient;

相关问题