Decoupling Tests from Implementation