2011-08-17 35 views
6

Tôi đã nhận một lớp bằng cách sử dụng một nhà máy để tạo một số đối tượng. Trong thử nghiệm đơn vị của tôi, tôi muốn truy cập giá trị trả lại của nhà máy. Vì nhà máy được chuyển trực tiếp đến lớp và không có getter cho đối tượng đã tạo được cung cấp, tôi cần phải chặn trả lại đối tượng từ nhà máy.Mockito + Spy: Cách thu thập các giá trị trả về

RealFactory factory  = new RealFactory(); 
RealFactory spy   = spy(factory); 
TestedClass testedClass = new TestedClass(factory); 

// At this point I would like to get a reference to the object created 
// and returned by the factory. 

Có khả năng truy cập giá trị trả lại của nhà máy không? Có lẽ sử dụng gián điệp?
Cách duy nhất tôi có thể thấy là để thử nhà máy tạo ra phương pháp ...

Trân

+0

Tại sao nên 'TestedClass' mất trong nhà máy là phụ thuộc. Không phải nó chỉ yêu cầu lớp thực tế được tạo ra bởi nhà máy. ? (Luật Demeter) –

+0

'TestedClass' là một thành phần OSGi. Một phương thức của thành phần yêu cầu mỗi lời gọi một đối tượng mới được tạo bởi nhà máy. Tôi đã tái cấu trúc đối tượng sáng tạo ra thành một lớp nhà máy để cung cấp khả năng kiểm tra tốt hơn. Vì đối tượng đã tạo được khởi tạo tùy thuộc vào các tham số của phương thức, nên không có cách nào để truyền vào đối tượng đã tạo thay vì nhà máy. –

Trả lời

1

Cách tiếp cận mocking tiêu chuẩn sẽ được:

  1. Pre-tạo ra các đối tượng mà bạn muốn nhà máy để trở lại trong trường hợp thử nghiệm
  2. Tạo mô hình (hoặc gián điệp) của nhà máy
  3. Quy định nhà máy sản xuất mô phỏng trả lại đối tượng được tạo trước của bạn.

Nếu bạn thực sự muốn có RealFactory tạo đối tượng một cách nhanh chóng, bạn có thể phân lớp nó và ghi đè lên các phương pháp nhà máy để gọi super.create(...), sau đó lưu các tham chiếu đến một lĩnh vực nào truy xuất bởi lớp kiểm tra, và sau đó trở lại đối tượng đã tạo.

24

Điều đầu tiên, bạn nên chuyển số spy vào làm đối số hàm tạo.

Điều đó sang một bên, dưới đây là cách bạn có thể thực hiện.

public class ResultCaptor<T> implements Answer { 
    private T result = null; 
    public T getResult() { 
     return result; 
    } 

    @Override 
    public T answer(InvocationOnMock invocationOnMock) throws Throwable { 
     result = (T) invocationOnMock.callRealMethod(); 
     return result; 
    } 
} 

sử dụng Dự định:

RealFactory factory  = new RealFactory(); 
RealFactory spy   = spy(factory); 
TestedClass testedClass = new TestedClass(spy); 

// At this point I would like to get a reference to the object created 
// and returned by the factory. 


// let's capture the return values from spy.create() 
ResultCaptor<RealThing> resultCaptor = new ResultCaptor<>(); 
doAnswer(resultCaptor).when(spy).create(); 

// do something that will trigger a call to the factory 
testedClass.doSomething(); 

// validate the return object 
assertThat(resultCaptor.getResult()) 
     .isNotNull() 
     .isInstanceOf(RealThing.class); 
+0

Cảm ơn bạn đã chia sẻ. IMHO: Đây phải là câu trả lời được chấp nhận. – BetaRide

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