I would not use a test double for BCrypt in this case. Generally we recommend only mocking interfaces you own, and you don't own the BCrypt interface. In addition, AFAIK, the BCrypt provides a pure, side-effect-free and I/O-free interface, so I don't see how using a test double benefits you -- in this situation it looks like it just tightly couples your test to the BCrypt interface (making your test more brittle) and makes your test less realistic (providing no confidence it'll work w/o the test double).
However, if you wanted to provide an abstraction over BCrypt (e.g. to support swapping out hashing implementations in a single spot), it would make sense to use a test double in place of your own abstraction.
For the user, I would not necessarily use a test double unless `User` was a heavy dependency. If it's just a light-weight struct or similar object, I'd just use the real thing. If you do use the test double, we recommend you use `instance_double("User")` so as to get interface verification.
HTH,
Myron