If your interface is too complex, you can still provide a "programmable" fake that lets tests configure or plug in its behavior in appropriate ways, instrucing it how to respond to inputs. Such a fake still provides value by structuring testing, and sharing lower-level, ancillary details of implementing the interface.
blog-post-replacing-mocks-with-hand-written-test-doubles