์์ฝ
Dummy
- interface์ ๋ชจ๋ ๋ฉ์๋๋ค์ด `return null;`๋ก ๊ตฌํ๋ ํ
์คํธ ๋๋ธ
Stub
- dummy์ ์ผ์ข
. 0์ด๋ null ๋์ ํ
์คํธ๊ฐ ํ์๋ก ํ๋ ํน์ ๊ฐ์ ๋ฐํ
Spy
- stub์ ์ผ์ข
. ์์ ์ด ํธ์ถ๋ fact๋ฅผ ๊ธฐ์ตํ๊ณ ํ์ ํ
์คํธ์ ์ด๋ฌํ fact๋ฅผ ๋ณด๊ณ
- ์ด๋ค ํจ์๊ฐ, ์ธ์ , ๋ช๋ฒ, ์ด๋ค ์ธ์๋ก ํธ์ถ๋์๋์ง ๋ฑ
Mock
- spy์ ์ผ์ข
. ์ด๋ค ์ผ์ด ์ผ์ด๋์ผ ํ๋์ง๋ฅผ ์๋ spy
Fake
- simulator
- ์ค์ธ๊ณ ๊ฐ์ฒด๊ฐ ํ๋ ๊ฒ ์ฒ๋ผ ์
๋ ฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋ต์ ํจ.
- ๋ณต์ก๋์ ์ ์ง๋ณด์๋ฅผ ์ํด์ ๊ฐ๊ธ์ ํผ์ ํ ํจ
mocking library๋ฅผ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
- user๊ฐ loginํ๋ฉด controller๊ฐ user name๊ณผ password๋ฅผ ๊ฐ๋จํ DS(LoginRequest)์ ๋ด์์ LoginInteractor์ ์ ๋ฌํ๋ค.
- LoginInteractor๋ user name๊ณผ password๋ฅผ ๊ฐ์ง๊ณ authorizer๋ฅผ ํตํด ํ์ธํ๋ค.
- Authorizer๊ฐ user๋ฅผ acceptํ๋ฉด Authorizer๋ valid user id๋ฅผ ๋ฐํํ๋ค.
- LoginInteractor๋ UserGateway๋ฅผ ์ฌ์ฉํด์ User ๋น์ฆ๋์ฆ ๊ฐ์ฒด๋ฅผ fetchํ๊ณ , ๋ง์ง๋ง ๋ก๊ทธ์ธ ์๊ฐ, ๋ก๊ทธ์ธ ํ์ ๋ฑ์ ์ป๋๋ค.
- LoginInteractor ๋ ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ค๋ฅธ ๋จ์ํ DS(LoginResponse)๋ฅผ ํตํด LoginPresenter์ ์ ๋ฌํ๋ค.
- LoginPresenter๋ ํ๋ฉด์ ๋ณด์ผ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฝ๊ฒ ์๋ํ๋ ํ ์คํธ๋ฅผ ๋ง๋ค ์ ์๋ค๊ณ ํ๋ค.
- setup์์ User๋ฅผ ์์ฑ. username, password๋ฅผ ๋ถ์ฌ
- user record๋ฅผ ์์ ํ์ฌ last login time๊ณผ login ํ์๋ฅผ ๊ฐ๋๋ก ํ๋ค.
์ด์ ๊ฐ์ด DB๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์คํธ๊ฐ ๋๋ ค์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์น์ ๊ฒฝ์ฐ๋ HTML์ ๊ธ์ด์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด์ผ ํ ์๋ ์๋ค. UI๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ํ ์คํธ๊ฐ ๊นจ์ง๊ฒ ๋๋ค. ๋ ํ ์คํธ๋ฅผ ์น์๋ฒ์์ ์ํํด์ผ๋ง ํ๋ค. ์ด๊ฑด ์ ๋ง ๋๋ฆฌ๋ค. ์ฐจ๋ผ๋ฆฌ ์๋ ํ ์คํธ๋ฅผ ํ๋๊ฒ ๋ซ๋ค.
Mocking์ ์ด์ฉํ๋ฉด ํด์๋๋ค. DB์ ์ฐ๊ฒฐํ ํ์๋ ์๊ณ , ์น์๋ฒ๋ฅผ ์ฌ์ฉํ ํ์๋ ์๋ค. ๋ HTML์ ๊ธ์ด์ ํ์ธํ ํ์๋ ์๋ค. mocking์ด ์์ํ๋๋ก nice clean decoupled ์ํคํ ์ณ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
์ ๊ทธ๋ฆผ์์ ๋นจ๊ฐ์ ๋ด๋ถ์ Interactor์ Interactor๊ฐ ์์ ์ ์ผ์ ์ํํ๊ธฐ ์ํด ํธ์ถํด์ผ ํ๋ ๋ชจ๋ ์ธํฐํ์ด์ค๊ฐ ์กด์ฌํ๋ค. ์ด ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ค์ authorizing, DB access, presentation ๋ฑ์ ๊ธฐ๋ฅ์ ์ํํ๋ค. ํ ์คํธํ ๋๋ ์ด๋ฌํ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค. ๋ค๋ฅธ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ํ ์คํธ๋ฅผ ๋๋ ๊ตฌํ์ฒด... ์ด๊ฒ์ด Mocking์ด๋ค.
ํ ์คํธ์์ ๊ฐ๋ณ์ ์ผ๋ก ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋๋ก ํ๊ธฐ ์ํด stub์ ์์ฑํ๋ค.
- UserId(1)์ ๋ฐํํ๋ StubAuthorizer
- InvalidUserID๋ฅผ ๋ฐํํ๋ RejectingAuthorizerStub
๋ฑ์ ๋ง๋ค์ด ๋๊ณ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ์ ์ ํ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
LoginInteractorImpl์ setAuthorizer, setUserGateway๋ ์๊ณ , ์ด๋ค์ ๋ํ stub์ด ํ์ํ์ง๋ง presenter๋ ๋ค๋ฅด๋ค๊ณ ํ๋ค. presenter์ ๋ํด์๋ ์ ์ ํ ์๊ธฐ์ ์ ์ ํ ๋ฉ์๋๊ฐ ํธ์ถ๋์๋์ง๋ง ํ์ธํ๋ฉด ๋๋ค. - interactor์ presenter์ ๋ํ relationship์ spyํ๊ธฐ ์ํ๋ค.
- stub์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋๋ก ์ค์ ๊ฐ๋ฅ
- spy๋ ์ถ๊ฐ์ ์ผ๋ก ์ด๋ค ์ธ์๋ฅผ ์ ๋ฌ๋ฐ์๋์ง๋ฅผ ์ ์ฅํ๋ค๊ฐ ์ ๋ฌ๋ฐ์ ์ธ์๋ฅผ assertํ ์ ์์.
๊ฐ์ฅ ๋จ์ํ ํ ์คํธ ๋๋ธ. interface์ ์๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ do nothing์ผ๋ก ๊ตฌํํ๋ ๊ฐ์ฒด๊ฐ Dummy. ๋ฆฌํดํ๋ ๊ฐ์ด ํ์ํ๋ค๋ฉด ๋๊ฐ null์ด๋ 0์ ๋ฐํ
public class HourlyReportInteractor {
public void generateReport(Date reportDate, Session session) {
if (!isValidReportDate(reportDate))
throw new InvalidDate();
//...
}
์ ์ฝ๋๋ฅผ ํ ์คํธํ๋ ค๊ณ ํ๋ค.
@Test(expected = HourlyReportInteractor.InvalidDate.class)
public void testInvalidDate() throws Exception {
Date reportDate = null;
Session session = new DummySession();
interactor.generateReport(reportDate, session);
}
DummySession - Session์ ์์ฑํ๊ธฐ ์ด๋ ค์ด ๊ฐ์ฒด์ด๋ค. - reportDate๊ฐ invalidํ ๊ฒฝ์ฐ session์ ์ฌ์ฉ๋์ง๋ ์๋๋ค. - DummySession์ ์ด์ฉํ๋ค(๋ชจ๋ method์์ return null) - ์ด๋ฐ ๊ฒฝ์ฐ Dummy๊ฐ ํจ์จ์ ์ด๋ค.
ํ ์คํธํ๋ ค๋ ๋ฉ์๋๊ฐ ์ธ์๋ฅผ ๊ฐ๋๋ฐ ํ ์คํธ๋ ํ ์คํธ๋๋ ํจ์๊ฐ ์ธ์์ ๋ฌด๊ดํ ๋ ์ฌ์ฉํ๋ค.
Dummy๋ ํ ์คํธ ๋๋ธ์ ์ผ์ข ์ผ๋ก ์ด๋ค ์ก์ ๋ ์ทจํ์ง ์๋ ํจ์๋ค๋ก ์ด๋ค์ง๋ค.
stub์ dummy์ ์ผ์ข ์ด๋ null, 0์ ๋ฐํํ๋ ๋์ ํน์ ํ ์คํธ๊ฐ ์๊ตฌํ๋ ๊ฐ์ ๋ฐํํ๋ค.
stub์ dummy์ด๋ค. ํจ์์์ ์ด๋ค ์ผ๋ ํ์ง ์๋๋ค. ํ์ง๋ง 0์ด๋ null ๋์ ์ด๋ค ์๊ตฌ๋๋ ๊ณ ์ ๋ ํน๋ณํ ๊ฐ์ ๋ฐํํ๋ค. ์๋ฌด๊ฒ๋ ํ์ง ์์ง๋ง ๋น์ ์ด ์ํ๋ ๊ฐ์ ๋ฐํํ๋ค.
stub์ ํน์ ๊ฒฝ๋ก๋ก ํ ์คํธ๊ฐ ์ํ๋๋๋ก ํ ๋ ์ฌ์ฉ๋๋ค.
login interactor์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์๋ชป๋ ํจ์ค์๋๋ฅผ ์ ๋ ฅํ์ ๋์ ํ์๋ฅผ ์ด๋ป๊ฒ ํ ์คํธํ ๊ฒ์ธ๊ฐ ? authenticator๋ฅผ stubํด์ false๋ฅผ ๋ฐํํ๋๋ก ํ์ฌ interactor๊ฐ ์ฌ๋ฐ๋ฅธ ํ์๋ฅผ ํ๋์ง๋ฅผ ํ์ธํ ์ ์๋ค.
ํ ์คํธ์ stub ๊ฐ์๋ ๋์ ๊ด๊ณ๊ฐ ์กด์ฌํ๋ค. ํ ์คํธ๋ ์ ์ ํ ๊ฒฝ๋ก๋ก ์ํ๋๋๋ก ํ๋ stub๋ฅผ ์ ํํ๋๋ก ์์ฑ๋๋ค. ์ฌ๋ฐ๋ฅธ ํจ์ค์๋๋ก login์ด ์ฑ๊ณตํ๋์ง ์กฐ์ฌํ๋ ํ ์คํธ๋ true๋ฅผ ๋ฐํํ๋ stub์ ์ฌ์ฉํ๊ณ , ์๋ชป๋ ํจ์ค์๋๋ฅผ ์ฒ๋ฆฌํ๋ login์ ์กฐ์ฌํ๋ ํ ์คํธ๋ false๋ฅผ ๋ฐํํ๋ stub์ ์ฌ์ฉํ๋ค.
spy๋ stub์ด๋ค. spy๋ ์์ ์ด ํธ์ถ๋ ํน๋ณํ fact๋ฅผ ๊ธฐ์ตํ๊ณ , ํ์ ํ ์คํธ์ ์ด๋ฌํ fact๋ฅผ ๋ณด๊ณ ํ๋ค.
- ์ด๋ค ํจ์๊ฐ ํธ์ถ๋์๋์ง
- ๊ทธ ํจ์๊ฐ ์ธ์ ํธ์ถ๋์๋์ง
- ๋ช๋ฒ์ด๋ ํธ์ถ๋์๋์ง
- ์ด๋ค ์ธ์๊ฐ ์ ๋ฌ๋์๋์ง
๋ฅผ ์๋ ค์ค ์ ์๋ค.
production ์ฝ๋๊ฐ ์ธ๋ถ ์๋น์ค๋ฅผ ์ ์ ํ๊ฒ ํธ์ถํ์๋์ง ํ ์คํธํ๊ณ ์ ํ ๋ ์ ์ฉํ ๊ธฐ๋ฒ์ด๋ค.
Mock์ Spy์ด๊ณ ์ถ๊ฐ์ ์ผ๋ก
- ํ ์คํธ์ ์ ์ฉํ ๊ฐ์ ๋ฐํํ๊ณ
- ํธ์ถ๋ fact๋ค์ ๋ํด์ ๊ธฐ์ตํ๋ค.
- ์ด๋ค ์ผ์ด ์ผ์ด๋์ผ ํ๋์ง๋ฅผ ์๋ Spy์ด๋ค.
๋ง์ง๋ง ํ ์คํธ ๋๋ธ์ Fake์ด๋ค. Fake๋ dummy๋ stub๋ spy๋ mock๋ ์๋ Simulator์ด๋ค.
์ค์ธ๊ณ ๊ฐ์ฒด๊ฐ ํ๋ ๊ฒ ์ฒ๋ผ ์ ๋ ฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋ต์ ํ๋ค.
fake๊ฐ ๋ง์์ง๋ฉด ๋ณต์กํด์ง๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์์ง๋ค. Test์์ ํ์ํ fake๋ง ์์ฑํ๋๋ก ํ๋ค.
avoid fakes when you can
๋จ์ ํ ์คํธ์์๋ fake๊น์ง ํ์ํ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค. ํ์ง๋ง integration test์์๋ fake๊ฐ ์ ์ฉํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.