การทดสอบใน Java เบื้องต้น
Maria Milusheva
Senior Software Engineer
ทบทวน dependency flow จากบทเรียนที่แล้ว: แอปแลกเปลี่ยนเงินตราขึ้นอยู่กับ bank server:

ไม่สามารถตรวจสอบการคำนวณได้ เพราะอัตราแลกเปลี่ยนเงินตรานั้นคาดเดาไม่ได้
Mocking - การสร้างออบเจกต์หรือพฤติกรรมจำลองแทนของจริงที่ใช้งานยากในการทดสอบ ช่วยให้ทดสอบได้โดยไม่ต้องพึ่ง external dependencies
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

พิจารณาตัวอย่างจากบทเรียนที่แล้ว:
public double convertEuroTo(String currency, double amount) {
double rate = this.bank.getRateEuroTo(currency);
return amount * rate;
}
➡ สร้างออบเจกต์ที่คาดเดาได้สำหรับ EuropeanCentralBankServer เพื่อใช้ทดสอบ
นี่คือวิธีทดสอบด้วย mock:
@Test void convert_returnsExpectedValue() { EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class); ExchangeApp exchangeApp = new ExchangeApp(bank);// Need to program the mock so it works when(bank.getRateEuroTo("USD")).thenReturn(1.1);// Calls getRateEuroTo from the mock object, obtaining our pre-programmed values double result = exchangeApp.convertEuroTo("USD", 1000); assertEquals(1100, result); // We can now assert on exact return values }
อย่าลืม program mock เสมอ:
@Test
void convert_returnsExpectedValue() {
EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// No mock programming - mock bank object doesn't know how to respond to getRateEuroTo
double result = exchangeApp.convertEuroTo("USD", 1000);
assertEquals(1100, result); // Will fail due to lack of mock setup
}
การทดสอบล้มเหลวพร้อมข้อความ:
org.opentest4j.AssertionFailedError:
Expected :1100.0
Actual :0.0
การ program mock เรียกว่า stubbing
Stubbing - การกำหนดคำตอบสำเร็จรูปขั้นต่ำสำหรับการเรียกใช้งานในระหว่างการทดสอบ โดยปกติจะไม่ตอบสนองต่อสิ่งที่ไม่ได้ตั้งโปรแกรมไว้
Mockito ยังสามารถจำลองสถานการณ์ข้อผิดพลาดได้:
EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// Instead of thenReturn() use thenThrow()
when(bank.getRateEuroTo("USD"))
.thenThrow(new RuntimeException("Bank server unavailable."));
exchangeApp.convertEuroTo("USD", 1000); // getRateEuroTo will throw exception
การทดสอบใน Java เบื้องต้น