[Junit] Mock, Fake, Stub 테스트 더블의 종류 본문

백앤드 개발일지/자바

[Junit] Mock, Fake, Stub 테스트 더블의 종류

giron 2022. 4. 22. 01:08
728x90

테스트 더블

더블이란: 할리우드에서 배우들의 대역을 해주는 사람을 더블이라고 한다.

그래서 말 그대로 테스트할 때 실제 도메인(주연)을 사용하지 않고 Double(대역)을 사용해서 테스트를 한다고 생각하면 된다.

double

테스트 더블에는 크게 위와 같이 Dummy, Stub, Spy, Mock, Fake로 나눠진다.

Dummy

  • 인스턴스화 하여 구현한 가짜 객체
  • 기능 구현이 안돼있다.

Stub

  • dummy를 이용하여 실제로 동작하는 것처럼 보이게 만드는 객체
  • 기능 구현이 안돼 있다.
  • 상태 검증을 위한 객체이다.
  • 상태 검증이란 메서드가 수행된 후, 객체의 상태를 보며 올바르게 동작했는지 확인한다는 뜻입니다.
  • 객체를 다양한 조건으로 값을 만들어주고 던져줘도 항상 동일한 값을 반환

Spy

  • 스파이처럼 기록을 하는 역할을 가진 객체이다
  • 몇 번 호출되었는지와 같이 기록할 때 사용한다.

Mock

  • stub과 달리 행위 검증을 위한 객체이다.
  • 행위 검증이란 메서드의 리턴 값으로 판단할 수 없는 경우 특정 동작을 수행하는지 확인한다는 뜻입니다.
  •  
    @Test
    public void mockTest(){
        List mockedList = mock(List.class);
	
    	// 행위 추가
        mockedList.add("one");
        mockedList.clear();

		// 행위 검증
        verify(mockedList).add("one");
        verify(mockedList).clear();
    }

Fake

  • 인메모리 디비라고 생각하면 된다.
  • 디비가 처리하는 것처럼 로직을 작성한다.
public class FakeDao implements Dao{
       Map<User, Account> accounts = new HashMap<>();
       
       @Override
       public Long save(User user){
       	accounts.put(...);
       	...
       }
}

 

 

 

 

 

https://stackoverflow.com/questions/346372/whats-the-difference-between-faking-mocking-and-stubbing

 

What's the difference between faking, mocking, and stubbing?

I know how I use these terms, but I'm wondering if there are accepted definitions for faking, mocking, and stubbing for unit tests? How do you define these for your tests? Describe situations whe...

stackoverflow.com

 

https://codinghack.tistory.com/92

 

Test Doubles(테스트 더블) — Dummy, Fakes, Mocks, Spy and Stubs

자동화된 테스트를 작성할 경우에 테스트들이 의존성을 가지고 같이 실행되어야 하는 경우가 많이 있는데요. 예를 들어 사용자를 조회하는 로직을 테스트한다고 한다면 UserService에서 UserRepositor

codinghack.tistory.com

 

728x90
Comments