คำถามติดแท็ก mocking

การเยาะเย้ยและการแกล้งเป็นวิธีในการแยกรหัสหรือส่วนประกอบเพื่อให้แน่ใจว่าการทดสอบหน่วยทำงานกับหน่วยที่ทดสอบได้ของรหัสเท่านั้นโดยไม่ต้องใช้ส่วนประกอบอื่น ๆ หรือการพึ่งพาของแอปพลิเคชัน การเยาะเย้ยนั้นแตกต่างจากการแกล้งซึ่งเยาะเย้ยสามารถตรวจสอบเพื่อยืนยันผลการทดสอบ

30
อะไรคือความแตกต่างระหว่างจำลองและต้นขั้ว?
ฉันได้อ่านบทความต่าง ๆ เกี่ยวกับการเยาะเย้ยและการขัดถูในการทดสอบรวมถึงMocks Arsenal ของมาร์ตินฟาวเลอร์ไม่ใช่ Stubแต่ก็ยังไม่เข้าใจความแตกต่าง
963 testing  mocking  stub 

10
วิธีการจำลองโมฆะด้วย Mockito
วิธีการเยาะเย้ยวิธีการที่มีประเภทผลตอบแทนเป็นโมฆะ? ฉันใช้รูปแบบการสังเกตการณ์ แต่ไม่สามารถเยาะเย้ยกับ Mockito ได้เพราะฉันไม่รู้ว่าจะทำอย่างไร และฉันพยายามค้นหาตัวอย่างบนอินเทอร์เน็ต แต่ไม่ประสบความสำเร็จ ชั้นเรียนของฉันมีลักษณะเช่นนี้: public class World { List<Listener> listeners; void addListener(Listener item) { listeners.add(item); } void doAction(Action goal,Object obj) { setState("i received"); goal.doAction(obj); setState("i finished"); } private string state; //setter getter state } public class WorldTest implements Listener { @Test public void word{ World w= …

11
ความแตกต่างระหว่างการแกล้งเยาะเย้ยและการขัดถูคืออะไร
ผมรู้ว่าผมใช้คำเหล่านี้ แต่ฉันสงสัยว่าถ้ามีได้รับการยอมรับคำจำกัดความของแกล้ง , เยาะเย้ยและstubbingสำหรับการทดสอบหน่วย? คุณกำหนดสิ่งเหล่านี้สำหรับการทดสอบอย่างไร อธิบายสถานการณ์ที่คุณอาจใช้แต่ละสถานการณ์ นี่คือวิธีที่ฉันใช้ ปลอม : คลาสที่ใช้อินเทอร์เฟซ แต่มีข้อมูลคงที่และไม่มีตรรกะ เพียงส่งคืนข้อมูล "ดี" หรือ "ไม่ดี" ขึ้นอยู่กับการใช้งาน เยาะเย้ย : ชั้นเรียนที่ใช้อินเตอร์เฟซและช่วยให้ความสามารถในการตั้งค่าแบบไดนามิกเพื่อส่งกลับ / ข้อยกเว้นที่จะโยนจากวิธีการเฉพาะและให้ความสามารถในการตรวจสอบว่าวิธีการเฉพาะได้รับการเรียก / ไม่เรียก Stub : เช่นเดียวกับคลาส mock ยกเว้นว่ามันไม่ได้ให้ความสามารถในการตรวจสอบว่าวิธีการที่ได้รับการเรียก / ไม่ได้เรียกว่า mocks และ stubs สามารถสร้างขึ้นด้วยมือหรือสร้างขึ้นโดยกรอบการเยาะเย้ย ชั้นเรียนปลอมถูกสร้างขึ้นด้วยมือ ฉันใช้ mocks เป็นหลักในการตรวจสอบการมีปฏิสัมพันธ์ระหว่างชั้นเรียนของฉันและชั้นเรียนที่ขึ้นต่อกัน ฉันใช้สตับเมื่อฉันตรวจสอบการมีปฏิสัมพันธ์และกำลังทดสอบเส้นทางอื่นผ่านโค้ดของฉัน ฉันใช้คลาสปลอมเป็นหลักในการสรุปข้อมูลการพึ่งพาข้อมูลหรือเมื่อ mocks / stubs น่าเบื่อเกินกว่าที่จะตั้งค่าในแต่ละครั้ง



6
Mockito สามารถจับข้อโต้แย้งของวิธีที่เรียกหลาย ๆ ครั้งได้หรือไม่?
ฉันมีวิธีที่ได้รับการเรียกสองครั้งและฉันต้องการจับอาร์กิวเมนต์ของการเรียกใช้เมธอดที่สอง นี่คือสิ่งที่ฉันได้ลอง: ArgumentCaptor<Foo> firstFooCaptor = ArgumentCaptor.forClass(Foo.class); ArgumentCaptor<Foo> secondFooCaptor = ArgumentCaptor.forClass(Foo.class); verify(mockBar).doSomething(firstFooCaptor.capture()); verify(mockBar).doSomething(secondFooCaptor.capture()); // then do some assertions on secondFooCaptor.getValue() แต่ฉันได้รับTooManyActualInvocationsข้อยกเว้นเนื่องจาก Mockito คิดว่าdoSomethingควรเรียกเพียงครั้งเดียว ฉันจะตรวจสอบข้อโต้แย้งของการโทรครั้งที่สองได้doSomethingอย่างไร?

5
ใช้ Mockito เพื่อจำลองวิธีการ แต่ไม่ใช่วิธีอื่น
มีวิธีใดบ้างที่ใช้ Mockito เพื่อเยาะเย้ยวิธีการบางอย่างในชั้นเรียน แต่ไม่ใช่วิธีอื่น ๆ ? ตัวอย่างเช่นในStockชั้นเรียนนี้ (ประดิษฐ์ขึ้นแล้ว) ฉันต้องการจำลองgetPrice()และgetQuantity()คืนค่า (ตามที่แสดงในตัวอย่างการทดสอบด้านล่าง) แต่ฉันต้องการgetValue()ให้ทำการคูณตามรหัสในStockชั้นเรียน public class Stock { private final double price; private final int quantity; Stock(double price, int quantity) { this.price = price; this.quantity = quantity; } public double getPrice() { return price; } public int getQuantity() { return quantity; } public …
402 java  mocking  mockito 

2
Mockito ทดสอบวิธีการโมฆะพ่นข้อยกเว้น
ฉันมีวิธีที่มีvoidประเภทผลตอบแทน นอกจากนี้ยังสามารถโยนข้อยกเว้นจำนวนหนึ่งได้ดังนั้นฉันต้องการทดสอบข้อยกเว้นที่ถูกโยนทิ้งไป ความพยายามทั้งหมดล้มเหลวด้วยเหตุผลเดียวกัน: วิธีการเมื่อ (T) ในประเภท Stubber ไม่สามารถใช้ได้กับข้อโต้แย้ง (เป็นโมฆะ) ความคิดใดที่ฉันจะได้รับวิธีการโยนข้อยกเว้นที่ระบุ doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));

3
ส่งคืนค่าที่ส่งผ่านไปยังเมธอด
ฉันมีวิธีการบนอินเตอร์เฟส: string DoSomething(string whatever); ฉันต้องการเยาะเย้ยนี้ด้วยขั้นต่ำเพื่อให้มันส่งคืนสิ่งที่ผ่านไป - สิ่งที่ต้องการ: _mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) ) .Returns( [the parameter that was passed] ) ; ความคิดใด ๆ
390 c#  mocking  moq 

11
การจำลองวิธีแบบคงที่ด้วย Mockito
ฉันได้เขียนโรงงานเพื่อผลิตjava.sql.Connectionสิ่งของ: public class MySQLDatabaseConnectionFactory implements DatabaseConnectionFactory { @Override public Connection getConnection() { try { return DriverManager.getConnection(...); } catch (SQLException e) { throw new RuntimeException(e); } } } ฉันต้องการตรวจสอบความถูกต้องของพารามิเตอร์ที่ส่งไปยังDriverManager.getConnectionแต่ฉันไม่ทราบวิธีการจำลองวิธีแบบคงที่ ฉันใช้ JUnit 4 และ Mockito สำหรับเคสทดสอบของฉัน มีวิธีที่ดีในการเยาะเย้ย / ตรวจสอบกรณีการใช้งานที่เฉพาะเจาะจงนี้หรือไม่?

14
กรอบการจำลองที่ดีที่สุดสำหรับ Java คืออะไร [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้มีแนวโน้มที่จะเรียกร้องการอภิปรายการโต้แย้งการหยั่งเสียงหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ กรอบที่ดีที่สุดสำหรับการสร้างวัตถุจำลองใน Java คืออะไร ทำไม? ข้อดีและข้อเสียของแต่ละเฟรมเวิร์กคืออะไร

7
กลยุทธ์ที่ดีที่สุดสำหรับแอปพลิเคชันที่ใช้ฐานข้อมูลทดสอบคืออะไร
ฉันทำงานกับเว็บแอปพลิเคชั่นจำนวนมากที่ขับเคลื่อนโดยฐานข้อมูลที่มีความซับซ้อนแตกต่างกันในแบ็กเอนด์ โดยทั่วไปจะมีเลเยอร์ORMแยกต่างหากจากตรรกะทางธุรกิจและการนำเสนอ สิ่งนี้ทำให้การทดสอบหน่วยตรรกะทางธุรกิจตรงไปตรงมา สิ่งที่สามารถนำมาใช้ในโมดูลแยกและข้อมูลใด ๆ ที่จำเป็นสำหรับการทดสอบสามารถแกล้งผ่านการเยาะเย้ยวัตถุ แต่การทดสอบ ORM และฐานข้อมูลนั้นมักจะเต็มไปด้วยปัญหาและการประนีประนอม ในช่วงหลายปีที่ผ่านมาฉันได้ลองใช้กลยุทธ์สองสามข้อ โหลดฐานข้อมูลทดสอบด้วยข้อมูลที่ทราบ เรียกใช้การทดสอบกับ ORM และยืนยันว่าข้อมูลที่ถูกต้องกลับมา ข้อเสียของที่นี่คือฐานข้อมูลการทดสอบของคุณต้องติดตามการเปลี่ยนแปลงใด ๆ ของสคีมาในฐานข้อมูลแอปพลิเคชัน นอกจากนี้ยังขึ้นอยู่กับข้อมูลเทียมและอาจไม่เปิดเผยข้อบกพร่องที่เกิดขึ้นเนื่องจากการป้อนข้อมูลของผู้ใช้ที่โง่ ในที่สุดหากฐานข้อมูลทดสอบมีขนาดเล็กก็จะไม่เปิดเผยความไร้ประสิทธิภาพเช่นดัชนีที่ขาดหายไป (ตกลงว่าอันสุดท้ายไม่ใช่การทดสอบหน่วยที่ควรใช้ แต่ไม่เจ็บ) โหลดสำเนาของฐานข้อมูลการผลิตและทดสอบกับที่ ปัญหาที่นี่คือคุณอาจไม่รู้ว่ามีอะไรในฐานข้อมูลการผลิตในเวลาใดก็ตาม การทดสอบของคุณอาจต้องเขียนใหม่หากข้อมูลเปลี่ยนแปลงตลอดเวลา บางคนชี้ให้เห็นว่ากลยุทธ์ทั้งสองนี้ขึ้นอยู่กับข้อมูลที่เฉพาะเจาะจงและการทดสอบหน่วยควรทดสอบการทำงานเท่านั้น ด้วยเหตุนี้ฉันได้เห็นข้อเสนอแนะ: ใช้เซิร์ฟเวอร์ฐานข้อมูลจำลองและตรวจสอบเฉพาะว่า ORM กำลังส่งแบบสอบถามที่ถูกต้องเพื่อตอบสนองต่อการเรียกใช้เมธอดที่กำหนด คุณใช้กลยุทธ์อะไรในการทดสอบแอพพลิเคชันที่ใช้ฐานข้อมูลหากมี สิ่งที่ได้ผลดีที่สุดสำหรับคุณ

4
Mockito สามารถตั้งวิธีโดยไม่คำนึงถึงข้อโต้แย้งได้หรือไม่?
ฉันพยายามทดสอบรหัสดั้งเดิมโดยใช้ Mockito ฉันต้องการ stub a FooDaoที่ใช้ในการผลิตดังนี้: foo = fooDao.getBar(new Bazoo()); ฉันเขียนได้: when(fooDao.getBar(new Bazoo())).thenReturn(myFoo); แต่ปัญหาที่ชัดเจนgetBar()คือไม่เคยถูกเรียกด้วยBazooวัตถุเดียวกันกับที่ฉัน stubbed วิธีการ (สาปแช่งnewผู้ประกอบการนั้น!) ฉันจะรักมันถ้าฉันสามารถ stub วิธีในวิธีที่มันกลับmyFooโดยไม่คำนึงถึงการโต้แย้ง ความล้มเหลวนั้นฉันจะฟังคำแนะนำการแก้ปัญหาอื่น ๆ แต่ฉันอยากจะหลีกเลี่ยงการเปลี่ยนรหัสการผลิตจนกว่าจะครอบคลุมการทดสอบที่สมเหตุสมผล

9
การใช้ Mockito กับการโทรหลายวิธีด้วยวิธีเดียวกันกับอาร์กิวเมนต์เดียวกัน
มีวิธีให้ stubbed วิธีการคืนค่าวัตถุต่าง ๆ ในการร้องขอต่อไป? ฉันต้องการทำสิ่งนี้เพื่อทดสอบคำตอบที่ไม่ExecutorCompletionServiceสิ้นสุดจาก คือการทดสอบโดยไม่คำนึงถึงลำดับการส่งคืนของวิธีการผลลัพธ์ยังคงที่ รหัสที่ฉันต้องการทดสอบมีลักษณะเช่นนี้ // Create an completion service so we can group these tasks together ExecutorCompletionService<T> completionService = new ExecutorCompletionService<T>(service); // Add all these tasks to the completion service for (Callable<T> t : ts) completionService.submit(request); // As an when each call finished, add it to …
289 java  mocking  mockito 

7
ฉันจะจำลองการนำเข้าโมดูล ES6 โดยใช้ Jest ได้อย่างไร
ฉันเริ่มคิดว่ามันเป็นไปไม่ได้ แต่ฉันต้องการถามต่อไป ฉันต้องการทดสอบว่าหนึ่งในโมดูล ES6 ของฉันเรียกโมดูล ES6 อื่นด้วยวิธีเฉพาะ ด้วยจัสมินนี่เป็นเรื่องง่ายสุด ๆ - รหัสแอพ: // myModule.js import dependency from './dependency'; export default (x) => { dependency.doSomething(x * 2); } และรหัสทดสอบ: //myModule-test.js import myModule from '../myModule'; import dependency from '../dependency'; describe('myModule', () => { it('calls the dependency with double the input', () => { …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.