2014-10-31 19 views
10

Tôi đang cố gắng để thực hiện Mockito để thử nghiệm một phương pháp cụ thể nhưng .thenReturn (...) dường như luôn luôn được trả về một đối tượng null thay vì những gì tôi dự định:Mockito - thenReturn luôn trả về null đối tượng

CUT:

public class TestClassFacade { 

    // injected via Spring 
    private InterfaceBP bpService; 

    public void setBpService(InterfaceBP bpService) { 

     this.bpService = bpService; 
    } 

    public TestVO getTestData(String testString) throws Exception { 

    BPRequestVO bpRequestVO = new BPRequestVO(); 

    bpRequestVO.setGroupNumber(testString) ; 
    bpRequestVO.setProductType("ALL") ;   
    bpRequestVO.setProfileType("Required - TEST") ; 

    IBPServiceResponse serviceResponse = bpService.getProduct(bpRequestVO); //PROBLEM 

    if (serviceResponse.getMessage().equalsIgnoreCase("BOB")) { 

     throw new Exception(); 

    } else { 

     TestVO testVO = new TestVO(); 
    } 

    return testVO; 
    } 

} 

xuân Cấu hình:

<bean id="testClass" class="com.foo.TestClassFacade"> 

    <property name="bpService" ref="bpService" /> 

</bean> 

<bean id="bpService" class="class.cloud.BPService" /> 

Mockito Phương pháp thử: sản lượng

@RunWith(MockitoJUnitRunner.class) 
public class BaseTest { 

    @Mock BPService mockBPService; 
    @InjectMocks TestClassFacade mockTestClassFacade; 

    private String testString = null; 
    private BPRequestVO someBPRequestVO = new BPRequestVO(); 
    private IBPServiceResponse invalidServiceResponse = new BPServiceResponse(); 

    @Test (expected = Exception.class) 
    public void getBPData_bobStatusCode_shouldThrowException() throws Exception { 

     invalidServiceResponse.setMessage("BOB"); 

     someBPRequestVO.setGroupNumber(null); 
     someBPRequestVO.setProductType("ALL"); 
     someBPRequestVO.setProfileType("Required - TEST"); 

     System.out.println("1: " + someBPRequestVO.getGroupNumber()); 
     System.out.println("2: " + someBPRequestVO.getProductType()); 
     System.out.println("3: " + someBPRequestVO.getProfileType()); 
     System.out.println("4: " + someBPRequestVO.getEffectiveDate()); 

     when(mockBPService.getProduct(someBPRequestVO)).thenReturn(invalidServiceResponse); 

     mockTestClassFacade.getTestData(testString); 

     verify(mockBPService).getProduct(someBPRequestVO); 
    } 
} 

hệ thống:

1: null 
2: ALL 
3: Required - TEST 
4: null 

gì đang xảy ra ở đây là khi tôi chạy thử nghiệm đối tượng serviceResponse là null trên dòng trong CUT được đánh dấu bằng // VẤN ĐỀ ở trên. Mong muốn của tôi là có đối tượng đó được điền bằng đối tượng "invalidServiceResponse" của tôi từ phương thức thử nghiệm của tôi. Đánh giá từ đầu ra của System.out.println của tôi nó xuất hiện rằng bpRequestVO của tôi phù hợp với someBPRequestVO của tôi trong nội dung.

Có thể một số người cho tôi thấy những gì tôi thiếu ở đây không?

Cảm ơn bạn đã dành thời gian!

+0

Nhiều khả năng nó không phù hợp với các thông số để getProduct mà bạn thiết lập trong bạn khi (...) với những gì đang được thông qua trong phương pháp thực tế.Hãy thử sử dụng matchers trong khi (service.getProduct (argThat (...)). sau đóReturn – LeffeBrune

+2

OP: bạn shoudl chấp nhận câu trả lời của @ lewthor thay vào đó, tôi đã nhầm lẫn, ghi đè '.equals()' là đủ, bạn không cần một đối số đối sánh – fge

+0

Cảm ơn bạn đã thực hiện tiếp theo ... Tôi vừa thử nghiệm nó với .equals() một mình và quay lại đến trang này để chắc chắn rằng tôi đã không hiểu lầm điều gì đó. Chắc chắn tôi đã tìm thấy bình luận của bạn! Tôi đã chuyển câu trả lời được chấp nhận. Cảm ơn sự trung thực của bạn. – risingTide

Trả lời

8

Ví dụ về BPRequestVO mà bạn sử dụng với when() khác với trường hợp được sử dụng trong getTestData().
Trừ khi bạn ghi đè equals(), chúng sẽ không khớp.

Bạn không cần phải viết Trình phù hợp tùy chỉnh nếu bạn ghi đè bằng(). Lưu ý sau đây từ Mockito documentation:.

"quẹt luận tùy chỉnh có thể làm bài kiểm tra ít có thể đọc Đôi khi nó tốt hơn để thực hiện equals() cho các đối số được truyền cho mocks (Mockito tự nhiên sử dụng equals() cho phù hợp với lập luận) Điều này có thể làm cho thử nghiệm sạch hơn."

+0

Cảm ơn lewthor! Tôi đã thêm các .equals() (và .hashcode) trong BPRequestVO và bây giờ tôi thấy một đối tượng serviceResponse được điền trong CUT của tôi khi tôi chạy trường hợp thử nghiệm của mình. – risingTide

4

Sự cố là do bạn sử dụng when().

Bạn gửi tham chiếu đến phiên bản được tạo; kết quả là, việc nhạo báng sẽ trả về những gì bạn muốn chỉ khi đối số được truyền cho phương thức là cùng một tham chiếu.

Điều bạn muốn là đối sánh đối số; một cái gì đó như:

when(mockBPService.getProduct(argThatMatches(someBPRequestVO)) 
    .thenReturn(whatYouWant); 

Tất nhiên, nó yêu cầu bạn viết đối sánh đối sánh!

Lưu ý rằng có một khớp dựng sẵn mà có thể làm những gì bạn muốn:

when(mockBPService.getProduct(eq(someBPRequestVO))).thenReturn(whatYouWant); 

khớp Điều này tất nhiên đòi hỏi lớp BPRequestVO bạn thực hiện equals() (và hashCode() quá)!

1

Thay vì tạo ra một tương đương với phương pháp trong bạn BPRequestVO lớp bạn có thể tạo một cuộc tranh luận giả với 'bất kỳ (YourObject.class)' như thế này:

when(mockBPService.getProduct(any(BPRequestVO.class))).thenReturn(invalidServiceResponse); 
Các vấn đề liên quan