Các lớp kiểm tra đơn vị có chức năng trực tuyến


23

Khi đơn vị kiểm tra chức năng của một lớp có chức năng riêng yêu cầu chức năng trực tuyến. Làm thế nào một người sẽ đi về thử nghiệm nó?

Ví dụ:

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

         return val;
    }

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

Nếu tôi đã kiểm tra chức năng: 'methodA ()' thì nó sẽ cố gắng sử dụng 'goOnlineToGetVal ()', lần lượt sẽ cố gắng lên mạng, nếu thử nghiệm này được thực hiện mà không có chức năng. Làm thế nào tôi có thể đi bảo hiểm 100% Class mà không cần lên mạng?


Có phải phương pháp của bạn chỉ gọi đám mây api, hay nó cũng thực hiện công việc bổ sung?
Winston Ewert


4
Phụ thuộc tiêm?
PhaDaPhunk

Câu trả lời:


76

new CloudService()

Và có vấn đề của bạn.

Thiết kế OO hiện đại khuyến nghị rằng loại phụ thuộc này được thông qua thay vì được xây dựng trực tiếp. Điều này có thể được truyền vào chính chức năng, hoặc đến lớp khi xây dựng. Nó cũng có thể được lấy hoặc tổng hợp bởi một thùng chứa Inversion of Control nếu loại phức tạp đó được bảo hành.

Vào thời điểm đó, việc chuyển một dịch vụ giả / giả để cung cấp cho bạn dữ liệu "trực tuyến" của bạn trong quá trình thử nghiệm trở nên khá đơn giản. Tốt hơn nữa, nó cho phép phần mềm của bạn đủ linh hoạt, để bạn có thể nhanh chóng thích nghi nếu một số khách hàng (chính phủ?) Đi cùng và không muốn sử dụng đám mây cho các giá trị của họ. Hoặc bạn muốn kết xuất một nhà cung cấp đám mây cho một nhà cung cấp khác. Hoặc là...


7
Tôi nghĩ rằng tôi đã tiến gần hơn để hiểu được Dependency Injection là cái quái gì.
marczellm

Đâu là nơi tốt nhất để tạo tất cả các phiên bản mà ứng dụng của tôi cần? Càng gần đầu ứng dụng của tôi càng tốt? Bạn chỉ có thể áp dụng tiêm phụ thuộc cho đến nay; tại một số điểm, bạn sẽ cần phải tự tạo các trường hợp thay vì đưa chúng qua làm đối số.
Paul

3
@Paul - Nó phụ thuộc. Theo kinh nghiệm của tôi, các ứng dụng thường trông giống như cây nhị phân - một lớp / hàm / mô-đun kết hợp hai thứ lại với nhau để cung cấp một số hành vi phức tạp hơn. Một trong những lớp "keo" đó là lớp chỉ định việc triển khai cụ thể, lần lượt được sử dụng bởi một thứ ở trên để dán nó với một thứ khác, đến lượt nó ... cho đến khi cuối cùng bạn đến điểm vào của mình để dán các mảnh lớn lại với nhau mạch lạc. Nơi "tốt nhất" là nơi cho phép mã của bạn làm những gì nó cần làm, mà không làm cho nó làm hoặc biết về những điều không nên làm. Nó sẽ thay đổi.
Telastyn

2
@Paul Thông thường, ứng dụng của bạn được phân chia giữa một "thư viện", được thử nghiệm trực tiếp và nên sử dụng loại tiêm phụ thuộc này và mã dành riêng cho ứng dụng. Cái sau thường đi sâu vào một số GUI, một số dịch vụ web hoặc một số giao diện dòng lệnh gọi trực tiếp thư viện với dữ liệu do người dùng cung cấp. Về cơ bản, mã dành riêng cho ứng dụng sẽ tạo ra các triển khai cụ thể mà thư viện được chèn phụ thuộc mong đợi.
Darkhogg

@Paul Hãy xem các container IoC như Castle Windsor, StructMap, Ninject và Unity. Chúng không phải là cách duy nhất để thực hiện tiêm phụ thuộc, nhưng chúng có thể rất hữu ích về mặt tư duy về việc xây dựng một biểu đồ đối tượng, từ trên xuống
Ben Aaronson

37

Tôi sẽ thực hiện nó như thế này:

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;
    }
}

Giao diện ICloudServicecó thể được triển khai với một bản giả để thử nghiệm hoặc với dịch vụ đám mây "thực". Khi việc khởi tạo new CloudService()là bắt buộc đối với mọi cuộc gọi getValueFromServicehoặc CloudServicetừ API của bên thứ 3 không thể thay đổi, hãy triển khai trình bao bọc, bắt nguồn ICloudServicevà thực hiện các cuộc gọi phù hợp.


1
Điều này chắc chắn là con đường để đi. Có các thư viện lớp có thể giả định một giao diện cho phép bạn kiểm soát tuyệt đối bài kiểm tra.
Greg Burghardt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.