测试替身之类型
測試樁Stub
樁:截斷的或非常短的物體。
測試樁,用最簡單的可能實現代替Real。
基本實現:所有方法僅一行,返回默認值。
偽造對象Fake
Fake是Real的簡化版本,但是沒有副作用。
public interface UserRepository {void save(User user);User findById(long id);User findByUsername(String username); }public class FakeUserRepository implements UserRepository {private Collection<User> users = new ArrayList<User>();public void save(User user) {if(findById(user.getId()) == null) {users.add(user);}}public User findById(long id) {for(User user : users) {if(user.getId() == id) {return user;}}return null;}public User findByUsername(String username) {for(User user : users) {if(user.getUsername().equals(username)) {return user;}}return null;} }測試間諜Spy
Spy是一種測試替身,它用于記錄過去發生的情況,測試事后知道所發生的一切。
public class DLog {private final DLogTarget[] targets;public DLog(DLogTarget... targets) {this.targets = targets;}public void write(Level level, String message) {for(DLogTarget each : targets) {each.write(level, message);}} }public class DLogTest {@Testpublic void writesEachMessageToAllTargets() {SpyTarget spy1 = new SpyTarget();SpyTarget spy2 = new SpyTarget();DLog log = new DLog(spy1, spy2);log.write(Level.INFO, "Hello world.");assertTrue(spy1.received(Level.INFO, "Hello world."));assertTrue(spy2.received(Level.INFO, "Hello world."));} }// 使用SpyTarget跟蹤數據 class SpyTarget implements DLogTarget {private List<String> log = new ArrayList<String>();public void write(Level level, String message) {log.add(concatenated(level, message));}public boolean received(Level level, String message) {return log.contains(concatenated(level, message));}private String concatenated(Level level, String message) {return level.getName() + ":" + message;} }模擬對象Mock
Mock是特殊的Spy。它是一個在特定情景下可配置行為的對象。
總結
- 上一篇: 数字签名,数字证书,证书链原理
- 下一篇: 接口隔离原则(ISP)