๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒพBackEnd/๐ŸŒฑ Spring

Mockito๋Š” ์•Œ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜์ž

by MuGeon Kim 2023. 3. 24.
๋ฐ˜์‘ํ˜•

 

Mockito - mockito-core 5.2.0 javadoc

Latest version of org.mockito:mockito-core https://javadoc.io/doc/org.mockito/mockito-core Current version 5.2.0 https://javadoc.io/doc/org.mockito/mockito-core/5.2.0 package-list path (used for javadoc generation -link option) https://javadoc.io/doc/org.m

javadoc.io

Mockito๋ž€?

Mock์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  mock์˜ ํ–‰๋™์„ ์ •ํ•˜๋Š” stubbing ๋กœ์ง์ด ์‹คํ–‰์ด ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ verify()๋ฅผ ์ด์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์ž…๋‹ˆ๋‹ค.

Stubbing์ด๋ž€

๋ชจ์˜ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๊ฐ’์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜์—ฌ ๋ฐ˜ํ™˜์„ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ๋ชจ๋“ธ ๊ฐ์ฒด๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์–ด๋–ค ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•ด๋†“๋Š” ๊ฒƒ์ด๋‹ค.

public interface MyService {
    String getName();
}

@Test
public void testMyService() {
    MyService myService = mock(MyService.class);
    when(myService.getName()).thenReturn("Mockito");

    String name = myService.getName();
    assertEquals("Mockito", name);
}

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด when().thenReturn()์„ ํ†ตํ•ด ๊ฐ’์„ ๋ฐ˜ํ™˜์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. 

๊ทธ๋ž˜์„œ service์— getName()์„ ์‹คํ–‰ํ•˜๋ฉด ์œ„์— ์„ค์ •ํ•œ Mockito๊ฐ€ ํ˜ธ์ถœ์ด ๋ฉ๋‹ˆ๋‹ค.

 

Mock์ด๋ž€

๊ฐ€์งœ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ํ…Œ์ŠคํŠธํ•  ๋•Œ ํ•„์š”ํ•œ ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•œ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ• ๋•Œ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

 

๋ชจ์˜ ๊ฐ์ฒด - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. -->

ko.wikipedia.org

์œ„์— ์‚ฌ์ดํŠธ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ ๋˜์–ด ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋– ํ•œ ์žฅ์ ์ด ์žˆ์„๊นŒ?

๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด DB์—์„œ ๊ฐ’์„ ์ฝ์–ด์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰. DB์™€ ์—ฐ๊ฒฐ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ…Œ์ŠคํŠธ์˜ ๊ด€์ ์—์„œ ๋ณด๊ฒŒ๋˜๋ฉด DB์™€ ์—ฐ๊ฒฐ์„ ํ•˜๋ฉด ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. 

๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด DB์™€ ์—ฐ๊ฒฐ์ด ๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๋งค๋ฒˆ ์ž‘์—…์„ ํ•˜๋ฉด DB์™€ ์—ฐ๋™์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํ•˜๊ฐ€ ๋งŽ์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ…Œ์ŠคํŠธ์˜ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์„ค๋ช…์„ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@SpringBootTest
class OwnerServiceTest2 {

  @Autowired
  private OwnerService ownerService;

  @Autowired
  private OwnerRepository ownerRepository;

  @BeforeEach
  void setUp() {
    List<Owner> ownerList = new ArrayList<>();
    for (int i = 0; i < 3; i++) {

      Owner owner = Owner.builder()
          .name("owner" + i)
          .build();

      Item item = Item.builder()
          .name("item" + i)
          .build();
      owner.addItem(item);
      ownerRepository.save(owner);
    }
  }

  @Test
  @DisplayName("findAll()๋กœ N+1๋ฌธ์ œ ๊ตฌํ˜„")
  public void findAllWith_N1_Invalid() {
    this.ownerService.findAll();
  }
}

์œ„์— ์ฝ”๋“œ๋Š” MOCK์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋ณธ์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด DB์™€ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค. 

์ด์ œ Mock์„ ์ด์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ์„ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ์˜์กด์„ฑ ์ถ”๊ฐ€

dependencies {
		testImplementation 'org.mockito:mockito-core:3.11.2'
    testImplementation 'org.mockito:mockito-junit-jupiter:3.11.2'
}

 

2. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

class OwnerServiceTest {
  
  private OwnerService ownerService;
  private final OwnerRepository ownerRepository = mock(OwnerRepository.class);

  @BeforeEach
  void setUp() {
    ownerService = new OwnerService(ownerRepository);

    List<Owner> ownerList = new ArrayList<>();

    for (int i = 0; i < 3; i++) {
      Item build = Item.builder()
          .name("์•„์ดํ…œ" + i)
          .build();
      Owner owner = Owner.builder()
          .name("๊น€๋ฌด๊ฑด"+i)
          .items(List.of(build))
          .build();
      ownerList.add(owner);
    }
    given(ownerRepository.findAll()).willReturn(ownerList);
  }

  @Test
  @DisplayName("findAll")
  public void findAllWithValid() throws Exception {
    // when
    List<String> actualOwners = ownerService.findAll();

    // then
    actualOwners.forEach(i->{
      System.out.println("i = " + i);
    });
  }
}

 ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์„ ํ•ด๋ณด๋ฉด DB์™€ ์—ฐ๊ฒฐ์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ์™€ DB์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

Mock๊ณผ Spy์— ๋Œ€ํ•ด ๋น„๊ตํ•˜์ž

Mock๊ณผ Spy๋Š” ๋ชจ๋‘ Mockito์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชฉ ๊ฐ์ฒด(Mock Object)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Mock๊ณผ Spy๋Š” ๋ชฉ์ ์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Mock ๊ฐ์ฒด๋Š” ์™„์ „ํ•œ ๊ฐ€์งœ ๊ฐ์ฒด๋กœ, ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๊ฐ์‹œํ•˜๊ณ  ๊ธฐ๋Œ€ํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์˜€์„ ๋•Œ ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€, ๋ฉ”์„œ๋“œ๊ฐ€ ์ ์ ˆํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š”์ง€ ๋“ฑ์„ ๊ฒ€์ฆํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Mock ๊ฐ์ฒด๋Š” Mockito์—์„œ ์ œ๊ณตํ•˜๋Š” mock() ๋ฉ”์„œ๋“œ๋‚˜ @Mock ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spy ๊ฐ์ฒด๋Š” ์‹ค์ œ ๊ฐ์ฒด์˜ ์ผ๋ถ€๋ถ„์„ ๋Œ€์‹ ํ•˜๋Š” ๊ฐ์ฒด๋กœ, ์‹ค์ œ ๊ฐ์ฒด์˜ ๋™์ž‘์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŠน์ •ํ•œ ๊ฐ์ฒด์˜ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งŒ Mock ๊ฐ์ฒด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ, ๊ทธ ์™ธ์—๋Š” ์‹ค์ œ ๊ฐ์ฒด์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Spy ๊ฐ์ฒด๋Š” Mockito์—์„œ ์ œ๊ณตํ•˜๋Š” spy() ๋ฉ”์„œ๋“œ๋‚˜ @Spy ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Mock ๊ฐ์ฒด๋Š” ์™„์ „ํ•œ ๊ฐ€์งœ ๊ฐ์ฒด๋กœ ๊ฐ์ฒด์˜ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉฐ, Spy ๊ฐ์ฒด๋Š” ์‹ค์ œ ๊ฐ์ฒด์˜ ์ผ๋ถ€๋ถ„์„ ๊ฐ€์งœ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต Mock ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜, ๊ฐ์ฒด์˜ ๋™์ž‘์„ ์˜ˆ์ธกํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋ฉฐ, Spy ๊ฐ์ฒด๋Š” ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

Mockito๋ž€? Mockito ์‚ฌ์šฉํ•˜๊ธฐ

Mockito๋ž€? · Mock ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ด€๋ฆฌํ•˜๊ณ , ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ - Mock: ์ง„์งœ ๊ฐ์ฒด์™€ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ํ–‰๋™์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด - ๊ณตํ™ˆ https://site.m

scshim.tistory.com

 

Mockito ๊ณต๋ถ€ํ•˜๊ธฐ #1

Mockito Docs๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€ ๋ฐ”๋กœ๊ฐ€๊ธฐ Mockito๋ž€? Mockito๋Š” Mock Object๋ฅผ creation, verification, stubbing ํ•ด์ฃผ๋Š” JAVA์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ

sun-22.tistory.com

 

๋ฐ˜์‘ํ˜•