Autofixture: AutoMoqData์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 04์›” 26์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: AutoFixture/AutoFixture

์•ˆ๋…•ํ•˜์„ธ์š”,

AutoMoqData์—์„œ ์ƒ์„ฑํ•œ ๋‚ด๋ถ€ Mocked Interface์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‚˜์š”

[Theory, AutoMoqData]
public void Dummy(IFixture fixture, ComplexClassWithInnerInterface sut)
{
    fixture.GetInstance<IInnerInterfaceMockCreatedByAutoMoqData>().Setup(x => x.Method).Result(something);

    Assert.Equal(String.Empty, String.Empty);
}

๊ฐ์‚ฌ ํ•ด์š”

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ›Œ๋ฅญํ•œ ๋‹ต๋ณ€์— ๋Œ€ํ•ด @xlecoustillier ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ์—์„œ ์ด ํŒจํ„ด์„ ์ง€์†์ ์œผ๋กœ ๋”ฐ๋ฅด๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ 30๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ๋ณด๊ธฐ ํ‰ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ์ด ์ฃผ์žฅ์€ ์ข€ ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์•„๋งˆ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๋””์ž์ธ๊ณผ ๊ทธ๊ฒƒ์˜ ๋ญ”๊ฐ€ ์ž˜๋ชป ๋‹น์‹ ์ด ์‹œ๋‚˜๋ฆฌ์˜ค ๐Ÿ˜Ÿ ๋‚œ ๋‹น์‹ ์ด ๋” ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ๋จผ์ € ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค @ploeh 99 % ํ•ด์š” ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ 30 ์ข…์†์„ฑ์„ ํ•„์š”๋กœํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ์˜ ์กฐ์–ธ์— ๋”ฐ๋ผ ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค ์ตœ๋Œ€ 3-4๊ฐœ์˜ ์ข…์†์„ฑ ๐Ÿ˜‚

๋”ฐ๋ผ์„œ ์กฐ๋ช…๊ธฐ์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ์ž…๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ณ ์ • ์žฅ์น˜์— GetInstance์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ž๋™ ์ƒ์„ฑ๋œ ๋ชจ์˜์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ „์ฒด ๋ฉ”์‹œ์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๊ณ  100% ํ™•์‹ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋‚ด๊ฐ€ ์–ป์€ ์ •๋ณด์—์„œ ๋‹น์‹ ์ด ์˜ณ์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ฐœ์ฒด๋Š” ์ผ์‹œ์ ์ด๋ฉฐ fixture ์€ ๊ฐœ์ฒด๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ • ๊ฐœ์ฒด๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด fixture.Freeze<>() API ๋˜๋Š” [Frozen] ์†์„ฑ ๋˜๋Š” ๊ธฐํƒ€ ์ ์ ˆํ•œ API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ์กด ๊ธฐ๋ณธ ๋™์ž‘์€ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋‹ค๋ฃจ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์œ ํ˜•๋ณ„๋กœ ๋™์ผํ•œ ๊ฐœ์ฒด๋ฅผ _์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค_.

์—ฌ์ „ํžˆ ์šฐ๋ฆฌ ์ธก์˜ ๋„์›€์„ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ๋” ์ •ํ™•ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ๋” ๋‚˜์€, ํ˜„์žฌ์˜ ํ•œ๊ณ„์™€ ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉํ‘œ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ๋” ๋‚˜์€ ๋™๊ธฐํ™”์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜‰

๊ฐ์‚ฌ ํ•ด์š”.

๋ชจ๋“  8 ๋Œ“๊ธ€

๋…ธ๋ ฅํ•˜๋‹ค

Mock.Get(sut).Setup(x => x.Method).Result(something);

Moq์— ์˜ํ•ด ์ƒ์„ฑ๋˜์ง€ ์•Š์€ Object ์ธ์Šคํ„ด์Šค๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ์ˆ˜.

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ณต์šฉ ์†์„ฑ์— ์žˆ์œผ๋ฉด ์‹ค์ œ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
Mock.Get(sut.InnerInterface).Setup(x => x.Method).Result(๋ฌด์–ธ๊ฐ€);

๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์กฐ๋กฑ๋˜๊ณ  ์ƒ์„ฑ์ž๊ฐ€ ์ฃผ์ž…๋˜๊ณ  IoC ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋˜์—ˆ์ง€๋งŒ ๊ณต์šฉ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ sut์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

์ด ๊ฒฝ์šฐ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋„ sut์— ์ฃผ์ž…๋˜๋„๋ก ๋ชจ์˜๋ฅผ ๋™๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Theory, AutoMoqData]
public void Dummy(
    IFixture fixture, 
    [Frozen]Mock<YourInnerInterface> innerInterfaceMock,
    ComplexClassWithInnerInterface sut)
{
    innerInterfaceMock.Setup(x => x.Method).Result(something);
    sut.DoSomething();
    Assert.Equal(String.Empty, String.Empty);
}

sut๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ๋”ฐ๋ผ์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฃผ์ž…๋˜๋„๋ก sut ์ „์— frozen mock์„ ํ•ญ์ƒ ์ƒ์„ฑํ•˜๋„๋ก ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค.

์ฐธ์กฐ๋ฅผ ์œ„ํ•ด ploeh์˜ ๋ธ”๋กœ๊ทธ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์•ˆ๋…•ํ•˜์„ธ์š”,
๋‚˜๋Š” ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 30๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ๋ณด๊ธฐ ํ‰ํ•ฉ๋‹ˆ๋‹ค.
๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” AutoMoqData๊ฐ€ ๋ชจ๋“  ๋ชจ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋™๊ฒฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ƒ๊ธฐ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์กฐ๋ช…๊ธฐ์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ์ž…๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ณ ์ • ์žฅ์น˜์— GetInstance์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ž๋™ ์ƒ์„ฑ๋œ ๋ชจ์˜์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ”ฝ์Šค์ณ ์ธ์Šคํ„ด์Šค๋กœ ๋ชจ์˜๋ฅผ ๊ณ ์ •ํ•˜๋ฉด ์ค‘๋ณต๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ sut๊ฐ€ ๋‚˜์ค‘์— ๊ณ ์ • ๋œ ๋ชจ์˜๋กœ ์—…๋ฐ์ดํŠธ ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ถ”์•…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ AutoMoqData๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ IFixture๋ฅผ ๋งŒ๋“ค๊ณ  ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ์—์„œ ๋ชจ์˜๋ฅผ ๊ณ ์ •ํ•˜๊ณ  ์„ค์ •ํ•œ ๋‹ค์Œ sut๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ชจ์˜๋ฅผ ๊ณ ์ •ํ•˜๊ณ  ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”

ํ›Œ๋ฅญํ•œ ๋‹ต๋ณ€์— ๋Œ€ํ•ด @xlecoustillier ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ์—์„œ ์ด ํŒจํ„ด์„ ์ง€์†์ ์œผ๋กœ ๋”ฐ๋ฅด๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ 30๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ๋ณด๊ธฐ ํ‰ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ์ด ์ฃผ์žฅ์€ ์ข€ ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์•„๋งˆ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๋””์ž์ธ๊ณผ ๊ทธ๊ฒƒ์˜ ๋ญ”๊ฐ€ ์ž˜๋ชป ๋‹น์‹ ์ด ์‹œ๋‚˜๋ฆฌ์˜ค ๐Ÿ˜Ÿ ๋‚œ ๋‹น์‹ ์ด ๋” ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ๋จผ์ € ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค @ploeh 99 % ํ•ด์š” ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ 30 ์ข…์†์„ฑ์„ ํ•„์š”๋กœํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ์˜ ์กฐ์–ธ์— ๋”ฐ๋ผ ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค ์ตœ๋Œ€ 3-4๊ฐœ์˜ ์ข…์†์„ฑ ๐Ÿ˜‚

๋”ฐ๋ผ์„œ ์กฐ๋ช…๊ธฐ์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ์ž…๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ณ ์ • ์žฅ์น˜์— GetInstance์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ž๋™ ์ƒ์„ฑ๋œ ๋ชจ์˜์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ „์ฒด ๋ฉ”์‹œ์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๊ณ  100% ํ™•์‹ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋‚ด๊ฐ€ ์–ป์€ ์ •๋ณด์—์„œ ๋‹น์‹ ์ด ์˜ณ์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ฐœ์ฒด๋Š” ์ผ์‹œ์ ์ด๋ฉฐ fixture ์€ ๊ฐœ์ฒด๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ • ๊ฐœ์ฒด๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด fixture.Freeze<>() API ๋˜๋Š” [Frozen] ์†์„ฑ ๋˜๋Š” ๊ธฐํƒ€ ์ ์ ˆํ•œ API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ์กด ๊ธฐ๋ณธ ๋™์ž‘์€ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋‹ค๋ฃจ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์œ ํ˜•๋ณ„๋กœ ๋™์ผํ•œ ๊ฐœ์ฒด๋ฅผ _์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค_.

์—ฌ์ „ํžˆ ์šฐ๋ฆฌ ์ธก์˜ ๋„์›€์„ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ๋” ์ •ํ™•ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ๋” ๋‚˜์€, ํ˜„์žฌ์˜ ํ•œ๊ณ„์™€ ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉํ‘œ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ๋” ๋‚˜์€ ๋™๊ธฐํ™”์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜‰

๊ฐ์‚ฌ ํ•ด์š”.

์˜ˆ, 30๊ฐœ์˜ ์ข…์†์„ฑ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์ž…๋œ ์ข…์†์„ฑ์„ ์–ป๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ @xlecoustillier๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ [Frozen] ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•˜๋‚˜์˜ ์˜ต์…˜์ด๋ฉฐ ์‹ค์ œ๋กœ ์†์„ฑ์ด ์›๋ž˜ ์กด์žฌํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

Mock.Get(sut.Dep1) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ œ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ [...] ์ƒ์„ฑ์ž ์ฃผ์ž… [...]์ด์ง€๋งŒ ๊ณต์šฉ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ su์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๊ทธ๋ ‡๋‹ค๋ฉด ์†์„ฑ์œผ๋กœ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹น์‹ ์ด ์ž‘๊ณกํ•œ ๊ฒƒ์„ ๋…ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. . ๊ทธ๊ฒƒ์„ ๋…ธ์ถœ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์บก์Šํ™”๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ตฌํ˜„์„ ๋ˆ„์ถœํ•˜๋Š” ๊ฒƒ ์ด์ƒ์€ ์•„๋‹Œ ์ถ”์ƒํ™”๋ฅผ ๊ฐ•ํ™”ํ•˜์ง€ ์•Š๊ณ  ์ข…์†์„ฑ์„ ํด๋ž˜์Šค ์†์„ฑ์œผ๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ง€์ •ํ•˜์—ฌ @ploeh ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ 

@malylemire1 ๋” ์ด์ƒ ๋„์›€์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ

ํ•œ ๋ฒˆ ๋” ์งˆ๋ฌธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ‘

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

josh-degraw picture josh-degraw  ยท  4์ฝ”๋ฉ˜ํŠธ

ecampidoglio picture ecampidoglio  ยท  7์ฝ”๋ฉ˜ํŠธ

JoshKeegan picture JoshKeegan  ยท  6์ฝ”๋ฉ˜ํŠธ

zvirja picture zvirja  ยท  3์ฝ”๋ฉ˜ํŠธ

Ridermansb picture Ridermansb  ยท  4์ฝ”๋ฉ˜ํŠธ