2011-07-11 32 views
10

Tôi đang sử dụng Mockito cho các bài kiểm tra đơn vị của mình và tôi đã đề xuất một vấn đề với việc ném ngoại lệ lên đối tượng gián điệp. Tôi đã làm điều này trước khi vào đối tượng này (trong trường hợp thử nghiệm khác nhau và nó đã làm việc). Dưới đây là các mã kiểm tra:Mockito từ chối ném ngoại lệ đã kiểm tra

@Test 
public void callInitiated_FsmInitializationException() throws FsmInitializationException, Exception { 
    MocSbb moc = Mockito.spy(testObj); 

    MocTracer tracer = Mockito.mock(MocTracer.class); 
    Mockito.doReturn(tracer).when(moc).getTracer(); 

    CAP2InitialDPArg idp = Mockito.mock(CAP2InitialDPArg.class); 
    MocFsm mocFsm = Mockito.mock(MocFsm.class); 
    //Mockito.doReturn(mocFsm).when(moc).getSs7Fsm(); 

    TicketingLocalInterface ticketing = mockTicketingLocalInterface(); 
    CAP2InitialDPArgWrap idpWrap = Mockito.mock(CAP2InitialDPArgWrap.class); 
    PowerMockito.whenNew(CAP2InitialDPArgWrap.class).withArguments(idp, tracer).thenReturn(idpWrap); 

    MocSession mocSession = Mockito.mock(MocSession.class); 
    Mockito.doReturn(mocSession).when(moc).getMocSession(); 

    Mockito.when(moc.getSs7Fsm()).thenThrow(new FsmInitializationException()); ////HERE'S THE PROBLEM 

    moc.callInitiated(idp); 

    verify(moc).getFailedFsm(); 
} 

đây là phương pháp mà trên đó các ngoại lệ nên được ném:

protected MocFsm getSs7Fsm() throws FsmInitializationException { 
    mocFsm.setContextProvider(getMocLocalObject()); 
    return mocFsm; 
} 

lỗi tôi nhận được trong quá trình thực hiện kiểm tra như sau:

Testcase: callInitiated_FsmInitializationException(com.nsn.as.ccs.moc.sbb.MocSbbTest): Caused an ERROR 

Checked exception is invalid for this method! 
Invalid: com.nsn.as.ccs.moc.fsm.FsmInitializationException 
org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method! 
Invalid: com.nsn.as.ccs.moc.fsm.FsmInitializationException 
at com.nsn.as.ccs.moc.sbb.MocSbbTest.callInitiated_FsmInitializationException(MocSbbTest.java:1194) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:322) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:309) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:112) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:73) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:297) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:222) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:161) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:135) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:133) 
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:112) 
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57) 

Liệu bất cứ ai có bất kỳ ý tưởng tại sao nó không hoạt động trong trường hợp này?

+1

Không phải là một trùng lặp nhưng một câu hỏi về chủ đề đó: http://stackoverflow.com/questions/3762047/throw-checked -exceptions-from-mocks-with-mockito –

+0

Tôi đã thấy điều đó, nhưng nó không trả lời câu hỏi của tôi. cảm ơn mặc dù – Edheene

+0

Loại testObj là gì? Có phải nó là 'MocSbb' hay nó là một siêu lớp hay giao diện? Giao diện/lớp cha có khai báo ngoại lệ không? – Bringer128

Trả lời

7

Cuối cùng tôi đã tìm thấy các giải pháp cho vấn đề này.

Chúng tôi đã sử dụng lớp ẩn danh mở rộng lớp gốc Sbb đã được kiểm tra và trong quá trình triển khai lớp mở rộng phương pháp được đề cập này đã bị thay đổi và biểu thức throws đã bị xóa gây ra sự cố.

Tôi nên đọc mã đồng nghiệp của mình cẩn thận hơn.

+0

Điều đó cũng xảy ra với tôi, nhưng với một lớp thực hiện một giao diện – JeanValjean

2

Tôi có cảm giác giải pháp là sử dụng cú pháp doThrow() thay vì khi(). ThenThrow(). Khi gián điệp, an toàn hơn là sử dụng cú pháp doThrow/doReturn để stubbing. Những lý do được phần nào được mô tả trong tài liệu hướng dẫn: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#13

Tôi nghĩ chúng ta có thể cải thiện một thông điệp ngoại lệ trong trường hợp này để nó là m

+0

Lý do: Khoảng trống cứng nhắc đòi hỏi cách tiếp cận khác với Mockito.when (Object) vì trình biên dịch không thích các phương thức void bên trong dấu ngoặc đơn. – rohanagarwal

0

Tôi biết bài đăng này rất cũ nhưng giải pháp của tôi có thể giúp ích cho ai đó: Tôi đã giải quyết lỗi này bằng cách thay đổi chế độ hiển thị của phương pháp của tôi để thử nghiệm công khai.

Trong trường hợp này bạn whould có sự thay đổi

protected MocFsm getSs7Fsm() throws FsmInitializationException { 
    ... 
} 

để

public MocFsm getSs7Fsm() throws FsmInitializationException { 
    ... 
} 
Các vấn đề liên quan