2015-12-17 6 views
10

जटिल सेटअप के बिट पर NotAMockException। Robolectric, PowerMockito नियम-आधारित कॉन्फ़िगरेशन।पावरमोकीटो: एक नकली

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21) 
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"}) 
// Using "PrepareOnlyThis" prevents powermock from trying to instrument the whole hierarchy, 
// part of which we've ignored (android.os.* in this case) 
@PrepareOnlyThisForTest({ServiceCallbackBase.class}) // this class extends Handler, 
// so we need PrepareOnlyThis. It also has some final methods we need to verify() 
public class ServiceBaseTests { 

    private class Foo { 
    // nothing 
    } 

    @Rule 
    public PowerMockRule rule = new PowerMockRule(); 

    private ServiceCallbackBase<Object, Foo> setupCallback(boolean hasValidContext, boolean allContextsCanceled) { 
    ServiceCallbackBase<Object, Foo> callback = PowerMockito.mock(ServiceCallbackBase.class); 
    // EDIT: I have converted these to PowerMockito.doReturn()s to no avail. 
    PowerMockito.when(callback.hasValidContext()).thenReturn(hasValidContext); 
    PowerMockito.when(callback.allContextsAreCanceled(any(Message.class))).thenReturn(allContextsCanceled); 
    PowerMockito.doNothing().when(callback).preSendMessage(any(Message.class)); 
    return callback; 
    } 

सुंदर दिनचर्या होना चाहिए। लेकिन जब भी मैं, इन "के लिए कॉलबैक" नकली उदाहरणों में से एक पर verify कॉल करने के लिए उदाहरण के लिए प्रयास करें:

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type ServiceCallbackBase$$EnhancerByMockitoWithCGLIB$$9acf906b and is not a mock! 
Make sure you place the parenthesis correctly! 
See the examples of correct verifications: 
    verify(mock).someMethod(); 
    verify(mock, times(10)).someMethod(); 
    verify(mock, atLeastOnce()).someMethod(); 

यह स्पष्ट रूप से और स्पष्ट रूप से किया गया द्वारा "बढ़ाया" है: मैं तो जैसे कोई त्रुटि मिलती है

private void test_notifyCallback(boolean isFromCache) { 
    ServiceCallbackBase<Object, Foo> callback = setupCallback(true, false); 

    uut.addHandler(TestEnum.FOO, callback); 
    uut.addHandler(TestEnum.BAR, PowerMockito.mock(ServiceCallbackBase.class)); 
    uut.addHandler(TestEnum.BAZ, PowerMockito.mock(ServiceCallbackBase.class)); 

    Response<Foo> foo = new Response<>(new Foo(), new ResponseStatus(0, "Error")); 
    uut.handleCallBack(TestEnum.FOO, foo, isFromCache); 

    ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class); 

    // this line throws the error. 
    verify(callback).preSendMessage(captor.capture()); 

    assertThat(captor.getValue().what).isEqualTo(TestEnum.FOO.ordinal()); 
    assertThat(captor.getValue().obj).isEqualTo(foo); 
    assertThat(captor.getValue().arg1).isEqualTo(isFromCache ? 1 : 0); 
    } 

mockito, और PowerMock में Mockito.verify() के बजाय उपयोग करने के लिए एक सत्यापित() विधि नहीं है ... क्या देता है?

EDIT: यह कुछ तरीकों से और कुछ तरीकों से कम भ्रमित है।

मैं सर्विसकॉलबैकबेस का परीक्षण करने के लिए एक और टेस्ट क्लास बनाने की प्रक्रिया में हूं। अगर मैं उस वर्ग से परीक्षण हटा देता हूं, तो ये परीक्षण पास होते हैं। एक अलग वर्ग में निम्नलिखित स्निपेट उपरोक्त परीक्षण विफल होने का कारण बनता है।

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21) 
public class ServiceCallbackBaseTests { 

    @Test 
    public void test_nothing(){ 

    } 

    private ServiceCallbackBase<Object, String> uutSpy; 


    @Before 
    public void setup(){ 
    uutSpy = mock(ServiceCallbackBase.class); 
    } 
} 
+0

यहां आपको उत्तर मिलेगा: http://stackoverflow.com/questions/29611893/mockito-notamockexception – piotrek1543

+0

आपको और अधिक विस्तृत होना होगा। सवाल का मुद्दा यह है कि यह एक नकली है, जैसा कि स्टैक ट्रेस में कक्षा के नाम में स्पष्ट रूप से इंगित किया गया है: 'ServiceCallbackBase $$ EnhancerByMockitoWithCGLIB $$ 9acf906b' –

उत्तर

11

मैं अपने उदाहरण निर्माण नहीं कर सकते, लेकिन मैं इस minitest कि एक बहुत ही इसी तरह की समस्या पैदा करता है लिखने में सफल:

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21) 
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"}) 
@PrepareOnlyThisForTest({ServiceCallbackBase.class, Dummy.class}) 
public class MainActivityTest { 

    @Rule 
    public PowerMockRule rule = new PowerMockRule(); 

    @Test 
    public void test1() throws Exception { 
     try { 
      //This Mockito.withSettings() thing is important to make the test fail! 
      ServiceCallbackBase callback = PowerMockito.mock(ServiceCallbackBase.class, Mockito.withSettings()); 

      callback.dispatchMessage(null); 
      Mockito.verify(callback).dispatchMessage(null); 

     } catch (Exception e){ 
      e.printStackTrace(); 
      Assert.fail(); 
     } 
    } 
} 

(Mockito.withSettings नोट(), मैं पता नहीं क्यों, लेकिन वह करता है विफल परीक्षण)

प्रिंटों:

org.mockito.exceptions.misusing.NotAMockException: 
    Argument passed to verify() is of type ServiceCallbackBase$$EnhancerByMockitoWithCGLIB$$62776c54 and is not a mock! 
    Make sure you place the parenthesis correctly! 
    ...... 

खैर, यह पूरी तरह से लग रहा है एक classloading मुद्दे के रूप में, mockito तुलना कर रहा है ServiceCallbackBase $$ EnhancerByMockitoWithCGLIB $$ आदि .. लोड एक ही Robolectric द्वारा लोड के साथ Powermock द्वारा (जाहिर है कि तुलना में झूठी लौटने)

फिर, मैं परीक्षण काम बस लाइन @PowerMockIgnore... को "org.powermock.*" जोड़ने यह है बनाने में कामयाब रहे:

@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "org.powermock.*"}) 

यह साधारण बदलाव काम करने के लिए मेरा परीक्षण, और मुझे उम्मीद है कि तुम्हारा भी बनाओ।

+0

मैं आपको इसके लिए पर्याप्त अपवर्त नहीं दे सकता। मुझे पता नहीं क्यों, लेकिन यह तय है। धन्यवाद! –

+0

मुझे खुशी है। आपका स्वागत है! – fonkap

+1

मुझे एक ही समस्या थी और यह समय के लिए तय किया गया था। सुनिश्चित करें कि आप प्रत्येक ** टेस्ट क्लास – andy9775

2

मैं भी इस समस्या में भाग गया। वास्तव में पावरमोक प्रोजेक्ट पर एक मुद्दा है: https://github.com/jayway/powermock/issues/593

लेकिन किसी भी पावरमॉक डेवलपर्स से कोई टिप्पणी नहीं।

संबंधित मुद्दे