๋ค์ํ ํ ์คํธ์ Test Double (+Mockist)
by JiwonDevMockito ๋ ํผ๋ฐ์ค https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html
# Test Double์ ์ข ๋ฅ
Test Double์ด๋ ์ํ ์ดฌ์์ ์ํํ ์ญํ ์ ๋์ ํ๋ ์คํดํธ-๋๋ธ ๋ฐฐ์ฐ๋ค์ฒ๋ผ ์ค์ ๊ฐ์ฒด๋ฅผ ๋์ ํ๋ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ํ ์คํ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ค์ ์๋ฏธํ๋ค. ํ ์คํธ ๋๋ธ์๋ Dummy, Fake, Stub, Spy, Mock์ด ์กด์ฌํ๋ค.
๋ชจ๋ Test Double์ ๋จ์ํ 'ํ ์คํธ ๊ฐ์ฒด'๋ผ๊ณ ๋ญ๋ฑ๊ทธ๋ ค ๋งํด๋ ์๊ด์ ์์ง๋ง, ๊ฐ๊ฐ์ ์ฉ๋๊ฐ ๋ค๋ฅด๊ณ ์์ฌ์ํต์ ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด์ ๊ตฌ๋ถํด์ ์ฌ์ฉํ๋๊ฒ ์ข๋ค.
@ Dummy Object
๊ป๋ฐ๊ธฐ๋ง ์๊ณ ์๋ฌด๋ฐ ๋์๋ ํ์ง์๋ ๊ฐ์ฒด์ด๋ค. (ํ๋ผ๋ฉํ์ ์ ๋ฌ๋๋ ๋๋ฏธ ๋น ๊ฐ์ฒด๋ฑ)
@ Fake Object
์ค์ ๊ฐ์ฒด์ฒ๋ผ ๋์ํ๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ํ ์คํธ ์ฉ๋๋ง ๊ฐ๋ฅํ๊ณ ์ค์ ์๋น์ค์๋ ์ ํฉํ์ง ์์ ๊ฐ์ฒด์ด๋ค.
๋จ์ํ๋ ๋์์ ์ ๊ณตํ์ฌ ํ ์คํธ๋ฅผ ์ฉ์ดํ๊ฒ ๋ง๋ ๋ค. H2 ๊ฐ์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ Fake ๋ผ๊ณ ๋ณผ ์์๋ค.
public final class FakeAccountRepository{
private final Map<Long, Account> data = new ConcurrentHashMap<>();
private final AtomicLong idGenerator = new AtomicLong();
public Account findByEmail(String email) {
return data.values().stream()
.filter(account -> email.equals(account.getEmail()))
.findAny()
.orElse(null);
}
public Account save(Account entity) {
entity.setId(idGenerator.incrementAndGet());
data.put(entity.getId(), entity);
return entity;
}
}
@ Stub Object
ํ ์คํธ์์ ํธ์ถ๋ ์์ฒญ์ ๋ํด ๋ฏธ๋ฆฌ ์ค๋นํด๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด์ด๋ค.
๋์์ฌ๋ถ๋ ์๊ด์๊ณ , ํ ์คํธ๋ฅผ ์ํด ๋ฏธ๋ฆฌ ์ค๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ์๋ตํ๋ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
private final class StubAccountRepository{
public Account save(Account account){
return new Account("person","123");
}
public int update(Account account){
return 1;
}
}
@ Spy Object (Stub + Logging)
Stub ๊ฐ์ฒด์ ์ญํ ์ ๊ฐ์ง๋ฉด์ ํธ์ถ๋ ๋ด์ฉ์ ์ ๋ณด๋ฅผ ํ ์คํธ ๋ก๊ทธ์ ๋จ๊ธด๋ค.
์๋ฅผ ๋ค์ด ๋ฉ์ผ๋ง ์๋น์ค์์ ๋ฐ์ก๋ ๋ฉ์ผ ๊ฐ์๋ฅผ ์ธก์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ฉด ๋๋ค.
@ Mock Object
ํธ์ถ์ ๋ํ ๊ธฐ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ช ์ธ specification ํด๋๊ณ , ํด๋น ๋ด์ฉ์ ๋ฐ๋ผ ๋์ํ๋๋ก ํ๋ก๊ทธ๋๋ฐ ๋ ๊ฐ์ง ๊ฐ์ฒด์ด๋ค.
Fake, Spy์ฒ๋ผ ์ค์ ๋์์ ๊ตฌํํ๋๊ฒ ์๋๋ผ Mocking ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ ๋ค.
๊ทธ๋ผ Stub์ด๋ ๋น์ทํ๊ฒ ์๋๊ฐ? ํ๋ ์๋ฌธ์ ๊ฐ์ง ์ ์๋ค. Stub์ ์๋์ ๊ฐ์ด ์ง์ ํ ์คํธ์ฉ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
public interface MailService {
public void send(Message msg);
}
public class MailServiceStub implements MailService {
private List<Message> messages = new ArrayList<Message>();
public void send(Message msg) { messages.add(msg); }
public int numberSent() { return messages.size(); }
}
Mock์ ํน์ ๋ฉ์๋๊ฐ ์คํ๋์์ ๋ ๋ฐํํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ชจํน(Mocking)ํ๊ณ ํ ์คํธ๋ฅผ ์งํํ๋ค.
โก ํน์ ๋์์ด ๋ฐ์ํ์ ๋ ๋ฐ์ดํธ์ฝ๋ ์กฐ์์ผ๋ก ๊ฐ๋ก์ฑ์ ๋ด๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋๋ก ๋ฐ๊พผ๋ค.
โก Mocking์ ๋ฉ์๋ ํธ์ถ๋ฟ๋ง์๋๋ผ ๊ฐ์ฒด์์ฑ, ์์ธ๋ฐ์, ๋ฉ์๋ ํธ์ถ์ฌ๋ถ(verify)๋ ์ฒ๋ฆฌํ ์ ์๋ค.
์ฆ Stub์ [์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ, ์ํ]๋ฅผ ๊ฒ์ฆํ๋ ์ฉ๋์ด๊ณ Mock์ [ํ์, ๋ฉ์๋ ์์ฒด]๋ฅผ ๊ฒ์ฆํ๋ ์ฉ๋์ด๋ค.
# ํ ์คํธ์ ์ข ๋ฅ
ํํ๋ค ํ ์คํธ๋ฅผ ์์ฑํ ๋ ๋จ์ํ ์คํธ, ํตํฉ, ๊ธฐ๋ฅ, ์น์ธ ํ ์คํธ๋ผ๋ ์ฉ์ด๋ฅผ ์ด๋ค. ์ด์ ๋ํด ์์๋ณด์.
@ ํ์ต ํ ์คํธ (learning Test)
์ด๋ ํ๋ก์ ํธ ํ ์คํธ์๋ ์ฐ๊ด์ด ์๋ค. ๋ง ๊ทธ๋๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ฐ๋ฐ์์ ํ์ต, ์ดํด๋ฅผ ๋๊ธฐ์ํ ํ ์คํธ.
python ์ฝ์์ฐฝ์ ์ด์ด if(3) print("A") ๊ฐ ๋์ํ๋์ง ๋๋ ค๋ณด๋ ๊ฒ๋ ์ผ์ข ์ ํ์ตํ ์คํธ๋ผ๊ณ ๋ณผ ์ ์๋ค.
ํ๋ก์ ํธ ๋ด๋ถ์ ํ์ตํ ์คํธ๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๋๋ ค๋ณด๊ณ ํด๋น ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ฐธ๊ณ ํ ์ ์๋ค.
๋ฌผ๋ก ํ์ํ์ง ์์ ๋๋ ํ ์คํธ๊ฐ ๋์ํ์ง ์๋๋ก ๋น๋์ ๋ฐ์ํ๋ ์๋ ํ ์คํธ์์ ์ ์ธ์์ผ๋ ๊ฒ์ ์์ง๋ง์.
@ ๋จ์ ํ ์คํธ (Unit Test)
[ํ ์คํธ๊ฐ ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ ๋จ์์ ์ฝ๋]๋ฅผ ํ ์คํธํ๋ ๊ธฐ๋ฒ์ด๋ค. ํ๊ธ๋ก ๋ฒ์ญํ๋ ์๋ฏธ๊ฐ ์กฐ๊ธ ์ด์ํ๊ธด ํ๋ค.
- ๋จ์ํ
์คํธ๋ [ํ
์คํธ๋ฅผ ํ๋ ์ฝ๋]๋ฅผ ์ ์ธํ๊ณ ๋ ๋ค๋ฅธ๊ณณ๊ณผ ์๋ฒฝํ๊ฒ ๋
๋ฆฝ์ ์ด์ด์ผํ๋ค.
โก ํ์๊ฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ํ ์คํธํ๋ค๋ฉด ํ์์ด ์ ๊ฐ์ ๋๋์ง ํ ์คํธํ๋๊ฑฐ์ง, ์น ์๋ฒ์ ์ ์๋์ ์ฌ๋ถ๋ ๋ค๋ฅธ ๊ณณ์์ ๋ฐ์ํ ์๋ฌ๊น์ง ์ก์ ํ์๋ ์๋ค. - ๊ทธ๋์ ๋จ์ํ
์คํธ์์๋ Test-Double์ ์ฌ์ฉํด ๋ค๋ฅธ ๊ณณ๊ณผ ์ฐ๊ฒฐ์ ๋์ด ๋
๋ฆฝ์ ์ผ๋ก ๋ง๋ ๋ค.
โก ํ ์คํธ์ ๋์ ๋ฒ์๊ฐ ์๊ธฐ์ ์ ์ฒด ์์คํ ์ค ์ด๋์ ๋ฌธ์ ๊ฐ ํ์ ํ๊ธฐ ์ฝ๋ค๋ ์ฅ์ ์ด ์๊ธด๋ค.
// ์ฌ๊ธฐ์์๋ Mock์ ์ฌ์ฉํ์ฌ ๋จ์ํ
์คํธ๋ฅผ ์งํํ์๋ค.
public void UpdateItem_changes_title(){
// Arrange (Given) - ํ
์คํธ๋ฅผ ์ํด ๋ฏธ๋ฆฌ ์ค๋น๋์ด์ผ ํ๋ ๊ฒ๋ค
IRepository repository = Mock.Of<IRepository>();
var sut = new BusinessLayer(repository);
int id = new Random().Next();
string title = Guid.NewGuid().ToString();
// Act (When) - ํ
์คํธ๋ฅผ ํ๊ณ ์ถ์ ๊ณณ, ๋์์ด ๋ฐ์ํ๋ ๊ณณ
sut.UpdateItem(id, title);
// Assert (Then) - ์ํ๋ ํ
์คํธ ๊ฒฐ๊ณผ
Mock.Get(repository)
.Verify(x => x.Update(id, title), Times.Once());
}
@ํตํฉ ํ ์คํธ (Integration Test)
์ฝ๊ฒ๋งํ๋ฉด ๋ค๋ฅธ ๊ณณ๊ณผ ๋ ๋ฆฝ์ ์ด์ง ์์ ๊ทธ๋ฅ ํ ์คํธ. ์ ์ฝ๋๋ฅผ ์์ฑํ ๋ [๋จ์ ํ ์คํธ ์ผ์ด์ค]๋ฅผ ์์ฑํ๊ณ , ์ด๋ฏธ ์์ฑ๋ ๋ ์ด์์ ์์คํ ์ด ์กฐ๋ฆฝ๋์ด ์ ๋์ํ๋์ง ํ์ธํ ๋ [ํตํฉ ํ ์คํธ ์ผ์ด์ค]๋ฅผ ์์ฑํ๋ค.
์ฌ๋ฌ๊ฐ์ง ๊ฐ์ฒด๋ค์ ์ค์ ๋ก ๊ฐ์ด ๋๋ ค๋ดค์ ๋ ๋ฌธ์ ์๋์ง ํ ์คํธํ๋ ๋ชฉ์ ๋ ์์ง๋ง, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฑ์ ํจ๊ป ์ฌ์ฉํ์ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ์ฌ๊ธฐ์์ ๊ฒ์ฆํ๋ค.
* ๋ค๋ง ํ ์คํธ๋ฅผ ์์ฑํ ๋ ๋จ์ํ ์คํธ์ ํตํฉํ ์คํธ๋ฅผ ๋๋ ํ์๊ฐ ์๋๋ฐ ์ต์ง๋ก ๊ตฌ๋ถํด์ ๋ง๋๋๊ฑด ์ข์ง ๋ชปํ ๋ฐฉ๋ฒ์ด๋ค. ํ ์คํ ์ ๋ณธ์ง์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋์ง, ์ด๊ฒ ์ ๋ขฐํ ์ ์๋ ์ค๊ณ์ธ์ง, ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ ์๋์ง ํ์ธํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
@์ธ์, ์น์ธ ํ ์คํธ(Accpetance Test)
์ด๊ฒ๋ ํ๊ธ๋ก ๋ฒ์ญํ ์๋ฏธ๊ฐ ์๋นํ ์ด์ํ๋ค. ์์ด๋ก๋ Acceptance Test
๋ง ๊ทธ๋๋ก ์ํํธ์จ์ด๊ฐ ๊ธฐํ๋๋ก ์ ๋์ํ๋์ง ํ ์คํธ์ด๋ค. ์ผ์ข ์ ๋ธ๋๋ฐ์ค ํ ์คํธ๋ผ๊ณ ๋ณผ ์ ์๋ค.
โก ๋จ์, ํตํฉํ ์คํธ์์ ๊ฒ์ถํ๊ธฐ ์ด๋ ค์ด ์์คํ ๋ฌธ์ , ์ค์ ์๋น์ค ํธ์คํ ํ๊ฒฝ๋ฑ์ ํจ๊ป ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋จ์, ํตํฉํ ์คํธ๋ง ์งํํด์๋ ์ ์ฒด์๋น์ค๊ฐ ์ ๋์ํ๋์ง ํ์ธํ๊ธฐ ์ด๋ ต๋ค. ์ฃผ๊ธฐ์ ์ผ๋ก ์ธ์ํ ์คํธ๋ฅผ ํด์ค์ผํ๋ค.
๋ค๋ง ๋จ์ํ ์คํธ, ํตํฉํ ์คํธ์ ๋ค๋ฅด๊ฒ ์ค์ ๋ก ๋ชจ๋ ์๋น์ค๊ฐ ๋์ํ๋๊ฑฐ๋ผ ํ ์คํธ ์๊ฐ์ด ๋งค์ฐ ๊ธธ๊ณ ์ด๋ค ์ฝ๋์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ฐพ๊ธฐ๊ฐ ์ด๋ ต๋ค.
โก ๊ทธ๋์ ๋จ์,ํตํฉํ ์คํธ๋ ๋๋ถ๋ถ ์๋ํํ์ง๋ง ์ธ์ ํ ์คํธ๋ ํ์ํ ๋๋ง ์๋์ผ๋ก ์ง์ ํ๊ธฐ๋ ํ๋ค.
@ E2E, ๊ธฐ๋ฅ ํ ์คํธ(Functional Testing)
์ธ์ ํ ์คํธ(Acceptance Test)์ ์ ์ฌํ์ง๋ง, ํ์๋ก ์๋ํํด์ผํ๋ ํ ์คํธ์ด๋ค. ์ฌ์ฉ์ ๊ด์ ์์ ๊ธฐ๋ฅ๋ค์ ํ๋์ฉ ํ ์คํธํ๋ค๋ ์๋ฏธ์์ E2E(End to End) ํ ์คํธ๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
- ์ธ์ ํ ์คํธ๋ ๋ด๋ถ์ฝ๋๋ ์๊ด์๊ณ ๊ธฐํ๋๋ก ์ ๋์ํ๋์ง๋ง ์ฒดํฌํ๋ ๋ธ๋๋ฐ์ค ํ ์คํธ์ด๋ค.
- ๊ธฐ๋ฅ ํ
์คํธ๋ ํ์ดํธ ๋ฐ์ค์ด๋ค. ์ฌ์ฉ์ ๊ด์ ์์ ๊ฐ ๊ธฐ๋ฅ ๋จ์๋ก ์ค์ ์๋น์ค ํ๊ฒฝ์์ ์ ๋์ํ๋์ง ํ
์คํธํ๋ค.
โก Mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์ค์ ๋ฐฐํฌํ๊ฒฝ์์ ํ ์คํธ๋ฅผ ์คํํ๋ค. ๋ง๊ทธ๋๋ก End-to-End๋ฅผ ๋ค ๊ฑฐ์น๋ ํ ์คํธ
public void UpdateCommand_changes_title_of_item()
{
// Arrange
var database = new SqlDatabase(...);
int id = database.Insert("Hello World");
string title = Guid.NewGuid().ToString();
// Act
ExecuteCommand($"Application.exe update {id} {title}");
// Assert
database
.Execute("SELECT TITLE FROM ...")
.Should().Be(title);
// Cleanup
database.Execute("DELETE ...");
}
# Mockist์ Classist
ํ๋์ ๋๊ตฌ๋ค์๋ ํ ์คํธ ๋๋ธ(test-double) ๊ฐ์ฒด๋ค์ ๊ธฐ๋ฅ์ด ์ ๋ง ๋ค์ํ๊ณ , ๋งค์ฐ ํธ๋ฆฌํ๋ค.
- ๋๊ตฌ์ ์ฌ์ฉ์ ์ ๋ง ํธํ์ง๋ง ๋ชจ๋ ๊ณณ์ ํ
์คํธ ๊ฐ์ฒด๋ฅผ ๋จ๋ฐํ๋ Mockist์ธ ์ฌ๋๋ค์ด ๋ฑ์ฅํ๊ณ ์๋ค.
โก ๊ทน๋จ์ ์ธ ์๋ก, [์ฌ์น์ฐ์ฐ +]๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ํ ์คํธ ๋๋ธ์ ๋ง๋ค์ด ์ฌ์ฉํ๋๊ฑธ ์์ํด๋ณด์.
ํ ์คํธ ๋์ญ์ ํ์ํ ๋ ์ฌ์ฉํ๋๊ฑฐ์ง, ๋ฌด์์ ๊ฐ๋ค์ด๋ค๊ณ ์ข์๊ฒ ์๋๋ค.
ํ ์คํธ ๋์ญ์ ์ผ์ข ์ ๊ฐ์ ์ด๊ณ , ๊ฐ์ ์ด ๋์ด๋ ์๋ก ์ค์ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ๊ธฐ ๋ ์ด๋ ค์์ง๋ค.
Mockist์ ๋ฐ๋๋ง๋ก ์ฌ์ฉ๋๋ Classist์ ์๋ฏธ๋, ๋จ์ํ ๊ผฐ๋์ฒ๋ผ
์ฃ๋ผ! Mockito๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๋ค๋! ์๋ฐ๋ก๋ง ์์ฑํด!
๋ผ๋๊ฒ ์๋๋ค. ํ์ํ ๋๋ง Test Double์ ์ฐ๋ ๊ฒ์ด ๋ ์ข์ ํ ์คํธ๋ฅผ ์์ฑํ ์ ์๋ค๋ ๋ง์ด๋ค.
์๋ฅผ ๋ค์ด Presentation (์น Controller) ๊ณ์ธต์ ์ฌ์ฉ์ ์์ฒญ์ Mockingํด์ ํ ์คํธํ๋๊ฒ ๋ง๋ค.
ํ์ง๋ง Domain ๊ณ์ธต์ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ์ง ์๋ฐ ๊ฐ์ฒด๋ค๋ง ์ด๋ฃจ์ด์ ธ์์ผ๋ฏ๋ก, ๊ตณ์ด Mock์ ์ฐ์ง์๋๋ผ๋ ์ถฉ๋ถํ ํ ์คํธ ํ ์ ์๋ค.
# Mockist์ Classist๋ฅผ ์ธ๊ธํ๋ ์ด์
์ด๊ท์๋์ ๊ทธ๊ฒ ํตํฉ ํ ์คํธ๋ผ๊ณ ? ์ ๋ง?์ ์ฝ์ด๋ณด๋ฉด ์ ์ด๊ฑธ ์ธ๊ธํ๋์ง ์ดํดํ ์ ์๋ค.
์๋๋ฆฌ์ค1. ์กฐ๊ธ ๊ทน๋จ์ ์ธ ์ด์ผ๊ธฐ
- ์ํ๋ค์ ๊ฐ๊ฒฉ ํฉ๊ณ๋ฅผ ๊ณ์ฐํด JSON์ผ๋ก ์ถ๋ ฅํ๋ ์์คํ ์ ์์ฑํ๋ค.
- ์ด ์์คํ ์ ๋จ์ํ ์คํธ๋ฅผ ํ๋๋ฐ JSON ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Mockingํ์ง ์๋๋ค. ๋น์ฐํ ์ด์ผ๊ธฐ์ด๋ค.
์๋๋ฆฌ์ค2. ํ์ค์ ์ธ ์ด์ผ๊ธฐ
- ์๋น์ค ์์คํ ๊ณผ ์ด๋ฅผ ์ด์ฉํ๋ ํด๋ผ์ด์ธํธ ์์คํ ์ ๋ง๋ ๋ค.
- ๊ฐ๋จํ๊ฒ ์๋น์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๊ณ , ์๋น์ค์ ํด๋ผ์ด์ธํธ๋ ๋์ผํ ํ๋ก์ธ์ค์์ ๊ตฌ๋๋๋ ๊ฐ์ฒด์ด๋ค.
- ์๋น์ค๋ API๋ง ๊ฐ๋ฐ ์๋ฃ๋์๊ณ , ๋ด๋ถ ๊ตฌํ์ ์์ง ๊ฐ๋ฐ์ค์ด๋ผ ๋์ํ์ง ์๋๋ค.
- ๊ทธ๋์ ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์๋ ๋จ์ ํ ์คํธํ๊ธฐ ์ํด ์๋น์ค ์์คํ ์ Mockingํ์ฌ ํ ์คํธํ๊ณ ๋์ด๊ฐ๋ค.
- ์ดํ ์๋น์ค์ ํด๋ผ์ด์ธํธ๋ ๊ฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ชจ๋ ๋จ์ํ ์คํธ๋ฅผ ์๋ฃํ์๋ค.
- ๊ทธ๋ฐ๋ฐ ์ด ๋ ๊ฐ๋ฅผ ์ฐ๊ฒฐ์์ผฐ์ ๋ ์ ์์ ์ผ๋ก ๋์ํจ์ ๋ณด์ฅํ ์ ์์๊น...?
- ๊ฒฐ๊ตญ Mocking์ ์ฌ์ฉํ์ง ์์ ํตํฉํ ์คํธ๊ฐ ์ถ๊ฐ๋ก ํ์ํ๋ค.
์๋๋ฆฌ์ค3. ์๊ฐํด๋ณผ ์ด์ผ๊ธฐ
- ์๋๋ฆฌ์ค2์ ๋์ผํ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ์ง๋ง, ์ด๋ฒ์๋ ์๋น์ค ์์คํ ๋ถํฐ ๋จผ์ ๊ฐ๋ฐ๋๋ค.
- ์๋น์ค ์์คํ ์ด ๋ชจ๋ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๊ณ , ๋จ์ ํ ์คํธ๋ฅผ ํตํด ๊ฒ์ฆ์ ์๋ฃํ๋ค.
- ์ด์ ํด๋ผ์ด์ธํธ ์์คํ ์ ๋ง๋ ๋ค.
- ์๋น์ค ์์คํ ์ ์ด๋ฏธ ํ ์คํธ ๊ฒ์ฆ์ด ์๋ฃ๋์๋ค. ๊ตณ์ด Mockingํ ํ์๊ฐ ์๋ค. ์ค์ ๊ฐ์ฒด๋ก ํ ์คํธํ๋ค.
- ํ์ง๋ง ๋๋ผ๋ฉด ์ด๋จ๊น? ์ด ๊ฒฝ์ฐ์๋ ๋จ์ํ ํธ๋ฆฌํ๋ค๋ ์ด์ ๋ก Mocking ํ์ง๋ ์์์๊น?
- ๊ทธ๋ฌ๊ณ ๋์ ๋จ์/ํตํฉ์ ๊ตฌ๋ถํ๊ธฐ ํ ์คํธ๋ฅผ ์ถ๊ฐ๋ก ์์ฑํ์ง๋ ์์์๊น?
ํ ์คํธ ๋์ญ์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํตํฉํ ์คํธ์ธ๊ฒ ์๋๋ค. ์ด๋ฐ ํ ์คํ ์ ์๋น์๋ ํ ์คํธ ์ผ์ด์ค ์์ฑ์ด ํ๋ค์ด์ง๊ฑฐ๋ ์คํ ๋น์ฉ์ ์ฆ๊ฐ์ํค์ง๋ ์๋๋ค.
Mockist๊ฐ ๋์ด ๋ฌด์์ ๋ชจ๋ ํ ์คํธ๋ฅผ ๋ถ๋ฆฌ์ํค๊ณ , Test-Double๋ก ๋์ฒดํ๋ ๋ฐ๋ณด๊ฐ ๋์ง๋ง์.
'๐ฑ Spring Framework > Test (JUnit, SpringBootTest)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ ์คํธ ๋ฐ์ดํฐ๋๊ตฌ - Fixture Monkey (3) | 2022.04.02 |
---|---|
์ข์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ (5) | 2022.03.08 |
spring security ํ ์คํธ์ฉ ์ค์ ๋ฐฉ๋ฒ (1) | 2022.03.07 |
Spring Boot Test์ ์ฌ๋ผ์ด์ค ํ ์คํธ (0) | 2021.09.08 |
์๋ฐ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ - JUnit5, AssertJ (0) | 2021.09.07 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev