คลาสการทดสอบหน่วยที่มีฟังก์ชันการทำงานออนไลน์


23

เมื่อหน่วยทดสอบฟังก์ชั่นของคลาสที่มีฟังก์ชั่นส่วนตัวที่ต้องการฟังก์ชั่นออนไลน์ เราจะทดสอบมันได้ยังไง?

ตัวอย่างเช่น:

public class Foo
{
    public int methodA()
    {
         int val = goOnlineToGetVal();

         return val;
    }

    private int goOnlineToGetVal()
    {
        CloudService c = new CloudService();
        int oval = c.getValueFromService();
        return oval;
    }
}

ถ้าฉันจะทดสอบฟังก์ชั่น: 'methodA ()' มันจะพยายามใช้ 'goOnlineToGetVal ()' ซึ่งจะลองใช้งานออนไลน์อย่างไรก็ตามหากการทดสอบนี้เสร็จสิ้นโดยไม่มีการใช้งาน ฉันจะได้รับความคุ้มครองระดับ 100% โดยไม่ต้องออนไลน์ได้อย่างไร


วิธีการของคุณเพียงแค่เรียกคลาวด์ api หรือมันทำงานเพิ่มเติมเช่นกัน?
Winston Ewert


4
ฉีดพึ่งพา?
PhaDaPhunk

คำตอบ:


76

new CloudService()

และมีปัญหาของคุณ

การออกแบบที่ทันสมัยของ OO แนะนำว่าการพึ่งพาประเภทนี้จะถูกส่งผ่านแทนที่จะสร้างโดยตรง สิ่งนี้สามารถส่งผ่านไปยังฟังก์ชั่นของตัวเองหรือไปยังชั้นเรียนในเวลาก่อสร้าง มันอาจถูกจับหรือรวมกันโดย Inversion of Control container ถ้ารับประกันความซับซ้อนนั้น

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


7
ฉันคิดว่าฉันเข้าใกล้มากขึ้นเพื่อทำความเข้าใจว่าการฉีดเฮคพึ่งพาอะไร
marczellm

ที่ที่ดีที่สุดในการสร้างอินสแตนซ์ทั้งหมดที่แอปพลิเคชันของฉันต้องการคือที่ไหน ใกล้เคียงกับส่วนบนสุดของใบสมัครของฉันมากที่สุด? คุณสามารถใช้การฉีดพึ่งพาเท่านั้น ในบางจุดคุณจะต้องสร้างอินสแตนซ์ของคุณเองแทนที่จะส่งเป็นอาร์กิวเมนต์
พอล

3
@Paul - มันขึ้นอยู่กับ จากประสบการณ์ของฉันแอปพลิเคชันมักจะดูเหมือนต้นไม้ไบนารี - หนึ่งคลาส / ฟังก์ชัน / โมดูลติดสองเข้าด้วยกันเพื่อให้พฤติกรรมที่ซับซ้อนมากขึ้น คลาส "กาว" หนึ่งในนั้นคือคลาสที่ระบุการติดตั้งที่เป็นรูปธรรมซึ่งบางสิ่งที่ถูกใช้โดยบางสิ่งที่อยู่เหนือนั้นจะติดกาวกับสิ่งอื่นซึ่งจะ ... จนกว่าคุณจะไปถึงจุดเริ่มต้นที่ติดกาวชิ้นใหญ่เข้าด้วยกัน เป็นตุเป็นตะ สถานที่ "ดีที่สุด" คือสถานที่ที่ให้โค้ดของคุณทำในสิ่งที่จำเป็นต้องทำโดยไม่ทำให้มันรู้หรือไม่ควรรู้ มันจะแตกต่างกันไป
Telastyn

2
@Paul โดยปกติใบสมัครของคุณจะถูกแบ่งระหว่าง "ไลบรารี่" ซึ่งได้รับการทดสอบโดยตรงและควรใช้การฉีดแบบพึ่งพานี้และรหัสเฉพาะแอปพลิเคชัน โดยปกติแล้วจะใช้งานกับ GUI บริการเว็บหรืออินเตอร์เฟสบรรทัดคำสั่งบางตัวที่เรียกใช้ไลบรารีโดยตรงกับข้อมูลที่ผู้ใช้จัดหา โดยพื้นฐานแล้วรหัสเฉพาะแอปพลิเคชันจะสร้างการใช้งานที่เป็นรูปธรรมที่ไลบรารีคาดหวังการพึ่งพา
Darkhogg

@Paul ดูที่คอนเทนเนอร์ IoC เช่น Castle Windsor, StructureMap, Ninject และ Unity พวกเขาไม่ได้เป็นวิธีเดียวที่จะทำการฉีดพึ่งพา แต่พวกเขาสามารถให้ข้อมูลในแง่ของการคิดเกี่ยวกับการสร้างกราฟวัตถุจากบนลงล่าง
Ben Aaronson

37

ฉันจะใช้มันเช่นนี้

public class Foo
{
    private ICloudService cloudService;

    public Foo(ICloudService s)
    {
       cloudService=s;
    }

    public int methodA()
    {
         int val = goOnlineToGetVal();

         return val;
    }

    private int goOnlineToGetVal()
    {
        int oval = cloudService.getValueFromService();
        return oval;
    }
}

อินเทอร์เฟซICloudServiceสามารถถูกนำไปใช้กับแบบจำลองสำหรับการทดสอบหรือกับ cloudservice "ของจริง" เมื่อการสร้างอินสแตนซ์new CloudService()จำเป็นสำหรับการโทรทุกครั้งgetValueFromServiceหรือCloudServiceมาจาก API ของบุคคลที่สามซึ่งไม่สามารถเปลี่ยนแปลงได้ให้นำเสื้อคลุมมาจากICloudServiceและทำการโทรที่เหมาะสม


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