2013-02-04 28 views
6

Tôi đang sử dụng Mockito để thử một lớp học có một phương pháp mà trông giống như sau:Kiểm tra tính nhất quán của nhiều đối số sử dụng Mockito

setFoo(int offset, float[] floats) 

Tôi muốn để có thể xác minh rằng các giá trị trong mảng (floats) bằng nhau (trong một dung sai đã cho) cho các giá trị trong một mảng các giá trị mong đợi.

Điều bắt được là tôi muốn kiểm tra nội dung của floats bắt đầu từ vị trí được chỉ định bởi offset. Với mục đích của bài kiểm tra, tôi không biết/quan tâm đến việc bù đắp là gì miễn là nó trỏ vào các giá trị mà tôi mong đợi. Tôi cũng không quan tâm những gì còn lại của mảng chứa. Tôi chỉ quan tâm đến các giá trị bắt đầu từ bù đắp được cung cấp.

Làm cách nào để thực hiện việc này?

+0

Có thể đó chỉ là tôi, nhưng tôi không hiểu câu hỏi của bạn. Có vấn đề gì với việc viết phương thức của riêng bạn để bù đắp và 2 mảng làm đối số và kiểm tra xem các phần tử trong các mảng này có bắt đầu từ offset không? –

+0

@AndrewLogvinov làm cách nào để "viết phương pháp của riêng tôi" trên đối tượng giả Mockito? –

+0

Tôi không nghĩ rằng bạn thậm chí nên. Sau khi gọi 'setFoo()' bạn mong đợi trạng thái của đối tượng đã thay đổi. Vì vậy, bạn nên truy vấn trạng thái của đối tượng và so sánh nó với các giá trị của bạn. Một số đoạn mã sẽ hữu ích để hiểu vấn đề tốt hơn. –

Trả lời

17

Trong khi một giả một phần không phải là một ý tưởng tồi, bạn có thể tìm thấy mã của bạn dễ dàng hơn để theo dõi nếu bạn sử dụng một số ArgumentCaptor thay thế để nhận các giá trị sau khi thực tế. Đó là một đối sánh đặc biệt theo dõi giá trị phù hợp.

// initialized with MockitoAnnotations.initMocks(); 
@Captor ArgumentCaptor<Integer> offsetCaptor; 
@Captor ArgumentCaptor<float[]> floatsCaptor; 
@Mock Bar bar; 

@Test 
public void valuesShouldBeCloseEnough() { 
    Sut sut = new Sut(bar); 
    sut.doSomething(); 
    verify(bar).setFoo(offsetCaptor.capture(), floatsCaptor.capture()); 

    // check values with assertValuesAreCloseEnough, declared elsewhere 
    assertValuesAreCloseEnough(offsetCaptor.getValue(), floatsCaptor.getValue()); 
} 
+0

Điều này thực hiện chính xác những gì tôi cần. Cảm ơn! –

1

Bạn muốn có một partial mock. Giả sử rằng lớp mà có setFoo() được đặt tên Bar:

private static abstract class AssertingBar implements Bar { 

    @Override 
    void setFoo(int offset, float[] floats) { 
    this.offset = offset; 
    this.floats = floats 
    } 

    public void verify(float[] expectedFloats, float delta) { 
    // do your verification here 
    } 
} 

@Test 
public void valuesShouldBeCloseEnough() { 
    AssertingBar bar = Mockito.mock(AssertingBar.class, Mockito.CALLS_REAL_METHODS); 

    Sut sut = new Sut(bar); 
    sut.doSomething(); 

    bar.verify(...); 
} 

Nếu Bar là một lớp học, không phải là một giao diện, sau đó bạn có thể sử dụng doCallRealMethod()

+0

'Mockito.CALLS_REAL_METHODS' dường như không hoạt động với giao diện. Tôi đã liên tục nhận được lỗi về việc cố gắng gọi một phương thức thực sự trên một giao diện. Tôi đã thực hiện một số tiến bộ với 'doCallRealMethod()', nhưng cách tiếp cận captor đối số được đề xuất trong một câu trả lời khác là dễ dàng hơn để làm việc và yêu cầu ít mã hơn cho trường hợp cụ thể này. Dù sao cũng cảm ơn bạn. –

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