Mockito ที่ไม่ใช่ Mockito เพราะมันคือ BDDMockito!

Rahat Sarawasee
Ascend Developers
Published in
Sep 30, 2020

--

What is BDD ?

The short answer :

BDD คือการเขียน testในรูปแบบนึงที่ช่วยให้มนุษย์เข้าใจง่าย และเป็นธรรมชาติ โดยมี keyword สำคัญ 3 คำ ที่ควรรู้คือ given, when, then

Luckily, there’s also a long answer:

Setup

Maven Dependencies :

<dependency>    
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.21.0</version>
</dependency>

Imports :

ทำการ import static class BDDMockito ใน class ที่เราต้องการจะ test

import static org.mockito.BDDMockito.*;

Mocking with BDDMockito

Example :

@ExtendWith(MockitoExtension.class)
public class BDDTest {

@Mock
List<Integer> mock;

@Test
@DisplayName("BDD Mockito")
void demoBDD() {
// Given == Mock
given(mock.size()).willReturn(3);

// When == Perform the test
int size = mock.size();

// Then == Assert
then(mock).should().size();
Assertions.assertEquals(3, size);
}
}

จากตัวอย่างทำการ setup class test ของเราเหมือนการทำ unit test ปกติ แต่สิ่งที่ต่างออกไปคือ มี method ใหม่ 2 ตัว given และ then

  • given() = จะทำการ mock method ว่าจะ return อะไรออกมา
  • when() = จะเป็นการ perform method ที่เราต้องการ test
  • then() = จะเป็นการ Assert ว่าสิ่งที่เราต้องการนั้นได้ผลลัพธ์ทีต้องการไหม

Mockito vs BDDMockito

traditional Mockito

@Test
@DisplayName("Mockito")
void demo() {
when(
mock.size()).thenReturn(3);

int size = mock.size();

verify(mock).size();
Assertions.assertEquals(3, size);
}

BDDMockito

@Test
@DisplayName("BDD Mockito")
void demoBDD() {
// Given == Mock
given(mock.size()).willReturn(3);

// When == Perform the test
int size = mock.size();

// Then == Assert
then(mock).should().size();
Assertions.assertEquals(3, size);
}

จากตัวอย่างจะเห็นได้ว่าการเขียนแบบ BDD จะมีความ readableมากกว่าการเขียนแบบปกติเนื่องจาก method given() ได้ทำการ wrap method when() ไว้ทำให้เราสามารถใช้ given() แทน when()ได้ ทำให้เราสามารถเขียน step แบบ BDD ได้ และในตัวของ then() เองก็ยัง provide method ที่ช่วยให้เราสามารถทำการ verify ได้ง่ายขึ้นอีกด้วย

Conclusion

การเขียนแบบ BDD เป็นอีกทางเลือกนึงที่ช่วยให้เราสามารถ define step ของการเขียน unit test ของเราได้ง่ายขึ้น อ่านได้ง่ายขึ้น ช่วยลดความซับซ้อนสำหรับการเขียน test ของเราได้มาก และยังคงความสามารถของ Mockito ไว้เหมือนเดิมอีกด้วย

--

--