我遇到了這樣的單元測驗
@InjectMocks
private PersonService personService;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Person person;
@Before
void init() {
when(person.getFirstName()).thenReturn("John");
when(person.getLastName()).thenReturn("Doe");
when(person.getBirthDate()).thenReturn("1990-01-01"); //sorry about the date string, just an example
}
@Test
void shouldReturnCorrectAge() {
Integer age = personService.getPersonAge(person);
assertEquals(32, age);
}
為什么要打樁?如果像下面的下一個代碼一樣直接分配值,有什么區別嗎?一種比另一種更好嗎?
Person person;
@Before
void init() {
person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
person.setBirthDate("1990-01-01"); //sorry about the date string, just an example
}
@Test
void shouldReturnCorrectAge() {
Integer age = personService.getPersonAge(person);
assertEquals(32, age);
}
uj5u.com熱心網友回復:
我認為在這個例子中第二個選項更好。
為像這樣的簡單 getter 設定存根并不是真正需要的 - 您通常應該在存在外部依賴項/類呼叫的情況下離開模擬,而不是在包含簡單值的 POJO 上。Mocks 有助于驗證互動并跟蹤呼叫方法的次數(例如,如果您想絕對確保在單元測驗中滿足某些條件時呼叫了某個 NotificationService 方法)。
在某些情況下,您可以像第二個示例一樣輕松地在外部服務類中設定值,但是在測驗單個類的功能時,您仍然應該使用模擬 - 模擬幫助您以 GIVEN 的方式設定測驗一些外部服務/方法回傳 X,做 Y。驗證其他類的輸出的責任取決于該類自己的單元測驗。
uj5u.com熱心網友回復:
在第一個場景中,您正在模擬該方法。這樣,如果 personService.getPersonAge() 呼叫任何這些人員方法,它將回傳選定的值
在第二種情況下,您正在創建一個 Person 物件。在這種情況下,當您傳遞 person 引數時,您就知道將回傳什么。
但是如果你有一個資料庫操作而不是一個吸氣劑呢?在這種情況下,您不應該在測驗中訪問資料庫,因此您在服務中模擬資料庫方法以回傳您想要的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/452773.html
