जटिल सेटअप के बिट पर 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);
}
}
यहां आपको उत्तर मिलेगा: http://stackoverflow.com/questions/29611893/mockito-notamockexception – piotrek1543
आपको और अधिक विस्तृत होना होगा। सवाल का मुद्दा यह है कि यह एक नकली है, जैसा कि स्टैक ट्रेस में कक्षा के नाम में स्पष्ट रूप से इंगित किया गया है: 'ServiceCallbackBase $$ EnhancerByMockitoWithCGLIB $$ 9acf906b' –