मुझे लगता है कि यह PowerMock के साथ ही संभव है अगर बच्चे पर विधि सुपरक्लास पर विधि से अलग है (यानी, यदि बच्चा उस विधि को ओवरराइड करता है तो आप पैरेंट विधि का नकल नहीं कर सकते हैं)। थोड़ी अधिक जानकारी के लिए, आप the relevant bug report देख सकते हैं।
पावरमोक के लिए, Suppressing Unwanted Behavior page देखें कि यह आपकी आवश्यकताओं के लिए पर्याप्त होगा या नहीं।
बहुत चारों ओर से खुदाई के बाद, मैं इन पेचीदा मामलों के लिए JMockit का उपयोग कर समाप्त हो गया। जेमॉकिट जाने से पहले, मैंने दमन का उपयोग करके सभी जगहों को अपवादों को फेंकने की कोशिश की। अंत में, मुझे कुछ तरीकों को ओवरराइड करने की आवश्यकता थी, न केवल उन्हें दबाएं, इसलिए मैंने इसे छोड़ दिया। एंड्रॉयड मामले के लिए
उदाहरण उपयोग:
पहले, आप अपने सुपर क्लास @MockClass
एनोटेशन का उपयोग कर बाहर नकली:
@MockClass(realClass = Activity.class, instantiation = PerMockedInstance)
public class FakeActivity {
public Bundle mSavedInstanceState;
@Mock
public void $init() {}
@Mock
public void onCreate(Bundle savedInstanceState) {
mSavedInstanceState = savedInstanceState;
}
}
सक्रिय होने पर, इस वर्ग के $init()
साथ Activity
के डिफ़ॉल्ट निर्माता का स्थान ले लेगा, और की जगह ऊपर दिए गए के साथ onCreate
विधि। WITH एंड्रॉइड, परीक्षण के तहत इकाई गतिविधि से ली गई है (मेरे नमूना कोड में, यह HelloTestActivity
है)। परीक्षण वर्ग इस तरह दिखता है:
public class HelloTestActivityTest3 extends AndroidTest {
@Tested
HelloTestActivity activity;
FakeActivity fakeActivity = new FakeActivity();
@Before
public void setupMocks()
{
Mockit.setUpMock(fakeActivity);
}
@Test
public void onCreate_bundle(@Mocked Bundle savedInstanceState)
{
// Try to access out-of-band information from the fake
activity.onCreate(savedInstanceState);
assertSame(savedInstanceState, fakeActivity.mSavedInstanceState);
}
}
कॉल Mockit.setupMock(fakeActivity)
नकली की मेरी उदाहरण के साथ सुपर वर्ग बदल देता है। इस उपयोग के साथ, आप अपनी नकली कक्षा की आंतरिक स्थिति तक भी पहुंच सकते हैं। यदि आपको कस्टम कार्यक्षमता के साथ किसी भी तरीके को ओवरराइड करने की आवश्यकता नहीं है, तो आप Mockit
कक्षा से उपलब्ध अन्य विधियों का उपयोग कर सकते हैं।
जैसा कि रोगिरियो ने नीचे दी गई टिप्पणियों में बताया है, Activity
कक्षा का मज़ाक उड़ा न्यूनतम है। निम्नलिखित कोड यह दर्शाता है।
public class HelloTestActivityTest4 {
@Tested
HelloTestActivity activity;
@Mocked
Activity base;
@Test
public void testOnCreate() throws Exception {
// Just make sure "Stub!" exception is not thrown.
activity.onCreate(null);
}
}
घोषणा @Mocked Activity base;
सभी तरीकों Activity
वर्ग की और उसके सुपर-क्लास (स्थिर initializers को छोड़कर) परीक्षण HelloActivityTest4
में परिभाषित में मज़ाक उड़ाया जा करने के लिए कारण बनता है।
कैसे करता है अपने नकली कॉल सुपर()? क्या आप एक कोड उदाहरण प्रदान कर सकते हैं? – nansen
@ नैनसेन मैं नकली से 'सुपर()' नहीं बुला रहा हूं, नकली सुपरक्लास है। कृपया मेरे संपादन देखें। –
मुझे वह वर्ग 'एस' पसंद नहीं है। – DerMike