5

Đối với lớp sau này, tôi muốn viết một bài kiểm tra đơn vị:Xác minh cuộc gọi đến phụ thuộc trong thử nghiệm đơn vị?

public class SomeClass { 

    private Dependency dependency; 

    public SomeClass(Dependency dep){ 
     this.dependency = dep; 
    } 

    private String processString(String s){ 
     /* 
     edit the string and return 
     */ 
    } 

    public void doSomething(String arg){ 

     String processed = processString(arg); 

     dep.doSomethingElse(processed); 
    } 
} 

Lúc đầu, tôi sẽ còn sơ khai tất cả các phương pháp SomeClass kêu gọi Dependency để kiểm tra lớp học của tôi trong sự cô lập. Nhưng câu hỏi tôi có thể chưa tìm thấy câu trả lời cho là:

Tôi có nên kiểm tra cáchSomeClass cuộc gọi phương pháp Dependency ví dụ những thông số nào được thông qua vv? Tất nhiên đây là một ví dụ khá tầm thường, nhưng tôi muốn biết liệu đây có phải là một phần của thử nghiệm đơn vị nói chung hay không.

Chỉnh sửa: Trong trường hợp của tôi Dependency sẽ là thư viện api bên thứ ba mà tôi không kiểm soát. Vì vậy, tôi sẽ xem xét nó quan trọng những gì các thông số được truyền cho các chức năng này tuy nhiên tôi không chắc chắn điều này nên là một phần của một bài kiểm tra đơn vị.

Trả lời

1

Tôi sẽ nói rằng nếu phụ thuộc được gọi thì bạn nên có ít nhất một trường hợp kiểm tra để kiểm tra xem nó có được gọi hay không. Nếu bạn không muốn bao gồm trường hợp này, có nghĩa là (đối với tôi) bạn không cần phải gọi nó anyway. Điều này rất quan trọng khi bạn có bất kỳ câu lệnh có điều kiện nào như if/else/switch. Bạn có thể tưởng tượng rằng chỉ do nhầm lẫn bạn đã xóa dòng mã này

dep.doSomethingElse(processed); 

Nếu không kiểm tra nếu phụ thuộc được gọi, bạn thậm chí sẽ không nhận thấy rằng bạn đã xóa nó.

Bài kiểm tra có thể trông giống như:

import static org.fest.assertions.Assertions.assertThat; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.ArgumentCaptor; 
import org.mockito.Captor; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.mockito.runners.MockitoJUnitRunner; 

@RunWith(MockitoJUnitRunner.class) 
public class SomeClassTest { 

    @Mock 
    private Dependency dependency; 

    @InjectMocks 
    private SomeClass someClass; 

    @Captor 
    private ArgumentCaptor<String> argumentCaptor; 

    @Test 
    public void shouldCallDependency() throws Exception { 
    //given 
    String arg = "arg"; 

    //when 
    someClass.doSomething(arg); 

    //then 
    Mockito.verify(dependency).doSomethingElse(argumentCaptor.capture()); 
    assertThat(argumentCaptor.getValue()).isEqualTo("processed"); 
    } 

} 
1

Kiểm tra Dependency không phải là một phần của các bài kiểm tra đơn vị của bạn về lớp SomeClass tức là không kiểm tra các cuộc gọi phương thức Dependency để biết chính xác và chính xác.

Bạn có thể kiểm tra giá trị tham số được chuyển đến phương thức Dependency nếu các giá trị đó là cục bộ cho lớp SomeClass tức là được tạo và quản lý bởi SomeClass nếu không thực hiện xác nhận kiểm tra nhập thông thường.

1

Đó thực sự phụ thuộc vào tình hình, và rất quan điểm dựa trên ...

Tôi xin nói, nếu cuộc gọi đến các phụ thuộc chỉ giúp phương pháp của bạn để làm công việc của mình, không kiểm tra các cuộc gọi. Chỉ cần kiểm tra xem phương pháp của bạn có thực hiện được công việc của mình hay không. Nếu cuộc gọi đến phụ thuộc là một phần quan trọng của chức năng, hoặc thậm chí toàn bộ lý do để thực hiện phương pháp của bạn, bạn nên xem xét kiểm tra xem phụ thuộc có được gọi chính xác hay không. .

Tự hỏi: bạn có thực sự quan tâm rằng sự phụ thuộc được gọi, và được gọi chính xác hay bạn chỉ quan tâm rằng phương pháp của bạn đang được thử nghiệm thực hiện công việc của mình?

Hoặc để xem xét nó từ một góc độ khác: Phụ thuộc chỉ là một phần của lớp học của bạn, hoặc là một đối tượng độc lập mà lớp của bạn đang tương tác?

Tôi biết, điều này khá mơ hồ, nhưng tôi hy vọng bạn có được ý tưởng.

Các vấn đề liên quan