कहलाती है, मैं एक निजी विधि बनाने के लिए मजाक करने की कोशिश कर रहा हूं जो जेएनडीआई कॉल कर रहा है। जब उस विधि को यूनिट परीक्षण से बुलाया जाता है, तो यह अपवाद फेंकता है ^। मैं परीक्षण उद्देश्यों के लिए उस विधि को नकल करना चाहता हूं। मैंने sample code from another questions answer का उपयोग किया, और परीक्षण पास होने पर, ऐसा लगता है कि अंतर्निहित विधि अभी भी कॉल हो जाती है। मैंने doTheGamble()
विधि में System.err.println()
डाला, और यह मेरे कंसोल पर मुद्रित हो जाता है।पावरमोक के साथ मॉक निजी विधि, लेकिन अंतर्निहित विधि अभी भी
दिलचस्प है, अगर मैं पहले assertThat
पर टिप्पणी करता हूं, तो परीक्षण पास हो जाता है। ? :(
तो, मैं कैसे एक निजी विधि बाहर नकली है इतना है कि यह कहा जाता है नहीं प्राप्त करता है?
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.support.membermodification.MemberMatcher.method;
import java.util.Random;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(CodeWithPrivateMethod.class)
public class PowerMock_Test {
static boolean gambleCalled = false;
@Test(expected = RuntimeException.class)
public void when_gambling_is_true_then_always_explode() throws Exception {
CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());
when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class))
.withArguments(anyString(), anyInt())
.thenReturn(true);
/* 1 */ assertThat(PowerMock_Test.gambleCalled, is(false));
spy.meaningfulPublicApi();
/* 2 */ assertThat(PowerMock_Test.gambleCalled, is(false));
}
}
class CodeWithPrivateMethod {
public void meaningfulPublicApi() {
if (doTheGamble("Whatever", 1 << 3)) {
throw new RuntimeException("boom");
}
}
private boolean doTheGamble(String whatever, int binary) {
Random random = new Random(System.nanoTime());
boolean gamble = random.nextBoolean();
System.err.println("\n>>> GAMBLE CALLED <<<\n");
PowerMock_Test.gambleCalled = true;
return gamble;
}
}
^जाहिर है, के बाद से मेरी कार्यक्षेत्र JNDI का समर्थन नहीं करता, केवल उत्पादन वातावरण
करता है% मैं एक नकली वस्तु के निर्माण के लिए सभी पुस्तकालय, JUnit 4.10, Mockito 1.8.5, Hamcrest 1.1, Javassist 3.15.0, और PowerMock 1.4.10।
+1 बग की हानि के लिए +1। आप की बहुत देखभाल;) – Guillaume
@ माइक क्या आपको कोई विचार है कि क्यों करें 'सचमुच (सत्य)। जब (जासूसी, "doTheGamble", anyString(), anyInt());' काम करता है लेकिन 'doReturn (true)। (Spy , विधि (CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class)) .withArguments (anyString(), anyInt()); '' अवैध अर्ग्यूमेंट अपवाद: तर्क प्रकार मिस्चैच 'में परिणाम? उत्तरार्द्ध उदाहरण की शैली और कम से कम समकक्ष रखने में अधिक लगता है लेकिन काम नहीं करता है। – ArtB
मैं ईमानदारी से नहीं कर सकता, क्षमा करें। मैं मॉकिटो/पावरमोक के लिए अपेक्षाकृत नया हूं ... मैंने कभी उस शैली में कोड लिखने का प्रयास नहीं किया है ('.withArguments (...)') पहले। – Mike