การเขียน Test ให้กับ WebFlux Controller

Sharing is caring!

การพัฒนา REST API ด้วย Spring WebFlux จำเป็นต้องทดสอบเพื่อให้มั่นใจว่า endpoint ต่าง ๆ ทำงานได้ถูกต้อง แม้จะเป็นระบบ reactive ก็ยังสามารถเขียน test ได้สะดวกผ่าน WebTestClient ซึ่งเป็น client สำหรับทดสอบแบบ non-blocking โดยเฉพาะ

🧰 เครื่องมือที่ใช้

  • WebTestClient – ทดสอบ WebFlux endpoint
  • Mockito – mock dependencies
  • StepVerifier – ตรวจสอบ Mono / Flux
  • @WebFluxTest – test เฉพาะ Web Layer

🌐 ตัวอย่าง Controller

@RestController
@RequestMapping("/greetings")
public class GreetingController {

  private final GreetingService greetingService;

  public GreetingController(GreetingService greetingService) {
    this.greetingService = greetingService;
  }

  @GetMapping("/{name}")
  public Mono<String> greet(@PathVariable String name) {
    return greetingService.greet(name);
  }
}

🧠 Service ที่จะถูก Mock

@Service
public class GreetingService {
  public Mono<String> greet(String name) {
    return Mono.just("Hello " + name);
  }
}

✅ ตัวอย่าง Test ด้วย WebTestClient

@WebFluxTest(GreetingController.class)
class GreetingControllerTest {

  @Autowired
  private WebTestClient webTestClient;

  @MockBean
  private GreetingService greetingService;

  @Test
  void shouldReturnGreetingMessage() {
    Mockito.when(greetingService.greet("World"))
        .thenReturn(Mono.just("Hello World"));

    webTestClient.get().uri("/greetings/World")
        .exchange()
        .expectStatus().isOk()
        .expectBody(String.class)
        .isEqualTo("Hello World");
  }
}

🔁 ทดสอบ Mono / Flux โดยตรง

@Test
void testMonoOutput() {
  Mono<String> result = greetingService.greet("ChatGPT");

  StepVerifier.create(result)
    .expectNext("Hello ChatGPT")
    .verifyComplete();
}

📌 จุดสำคัญในการทดสอบ

  • test HTTP status code
  • test response body
  • test กับ input ไม่ถูกต้อง
  • test เมื่อเกิด exception หรือ empty result

🧪 @WebFluxTest ใช้ตอนไหน

เมื่อคุณต้องการทดสอบเฉพาะ Controller โดยไม่โหลด Bean อื่น ๆ ทั้งหมดใน Spring Context

📸 ภาพประกอบ WebTestClient Flow

🛠️ เทคนิคแนะนำ

  • ใช้ @MockBean เพื่อ inject mock เข้ากับ Spring context
  • ระบุ class ที่ต้องการ test โดยตรงใน @WebFluxTest
  • ใช้ @SpringBootTest + WebTestClient ถ้าต้องการ integration test เต็มรูปแบบ

📋 กรณีทดสอบเพิ่มเติม

  • ตรวจสอบ 404 เมื่อไม่พบข้อมูล
  • ตรวจสอบ 400 เมื่อส่ง request ไม่ถูกต้อง
  • ตรวจสอบ 500 เมื่อเกิด exception

🔚 สรุป

  • WebTestClient เหมาะสำหรับการทดสอบ reactive controller
  • สามารถ mock service ได้ง่ายด้วย @MockBean
  • StepVerifier เหมาะสำหรับ test logic ที่ return Mono หรือ Flux

🔍 คำค้น SEO

spring webflux test, webtestclient example, mock webflux controller, webflux unit test, test mono flux spring, spring boot reactive controller test, reactive endpoint testing, @WebFluxTest spring boot

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *