If you need to do jest.fn() to maybe later call .toHaveBeenCalledWith() or .toHaveBeenTimes(1) - but also need to mock the result of the jest.fn() call, you can do something like the below:
it('does an example test run', async () => {
const roleFn = jest.fn()
const getAppByIdFn = jest.fn()
roleFn.mockImplementation(() => { return { id: '', getByApplicationId: getAppByIdFn } })
getAppByIdFn.mockImplementation(() => { return { id: '' } })
expect(roleFn).toHaveBeenCalledWith('ARG 1')
expect(roleFn).toHaveBeenCalledWith('ARG 2')
expect(roleFn).toHaveBeenCalledWith('ARG 3')
})