After examine the OCMock code, I found my problem. Effectively a typo but its subtle enough that I don't think it's worth deleting the question.
Change:
[invocation setReturnValue:(void*)path];
To:
[invocation setReturnValue:&path];
My original way of writing this destroyed a layer of abstraction because the NSString was being treated as an address, rather than using its actual address.