•
복잡한 로직이나 객체 내부에서 필요로 하는 다른 외부 객체들의 동작을 단순화하여 구현한 객체이다.
•
동작의 구현을 가지고 있지만 실제 프로덕션의 비즈니스 로직이 존재하지 않거나 적합하지 않은 객체이다.
@Entity
public class UserProfile {
@Id
private Long userId;
private String userName;
protected UserProfile() {}
public UserProfile(Long userId, String userName) {
this.userId = userId;
this.userName = userName;
}
public Long getUserId() {
return this.userId;
}
public String getUserName() {
return this.userName;
}
}
public interface UserProfileRepository {
void save(UserProfile userProfile);
UserProfile findByUserId(long userId);
}
public class InMemoryUserProfileRepository implements UserProfileRepository {
private Collection<UserProfile> userProfiles = new ArrayList<>();
@Override
public void save(UserProfile userProfile) {
if (findByUserId(userProfile.getUserId()) == null) {
userProfiles.add(userProfile);
}
}
@Override
public UserProfile findByUserId(long userId) {
for (UserProfile userProfile : userProfiles) {
if (userProfile.getUserId() == userId) {
return userProfile;
}
}
return null;
}
}
Java
복사
•
위 코드와 같이 테스트해야 하는 객체가 외부에 의존성을 가지고 있는 경우가 대표적이다.
•
이 경우, 단위 테스트를 진행할 때는 FakeUserProfileRepository를 만들어 테스트 객체에 주입하는 방법을 사용할 수 있다.
•
이렇게 가짜 객체를 전달하면 단위 테스트는 데이터베이스에 의존하지 않으면서도 기존 의존성을 유지하면서 테스트 로직을 수행할 수 있게 된다.
•
이처럼 실제 인스턴스화 되어있으면서 메소드 또한 동일한 기능을 수행하도록 만들어 사용하는 객체가 Fake다.