के साथ लॉगर और लॉगरफ़ैक्टरी का मज़ाक उड़ा रहा है मेरे पास निम्न लॉगर है जो मैं नकल करना चाहता हूं, लेकिन लॉग प्रविष्टियों को सत्यापित करने के लिए सामग्री के लिए नहीं कहा जा रहा है।पावरमॉक और मॉकिटो
private static Logger logger =
LoggerFactory.getLogger(GoodbyeController.class);
मैं किसी भी वर्ग कि LoggerFactory.getLogger() के लिए प्रयोग किया जाता है उपहास करने के लिए चाहते हैं, लेकिन मैं बाहर है कि कैसे करना है नहीं पा सके। यह वही है मैं अब तक के साथ समाप्त हो गया है:
@Before
public void performBeforeEachTest() {
PowerMockito.mockStatic(LoggerFactory.class);
when(LoggerFactory.getLogger(GoodbyeController.class)).
thenReturn(loggerMock);
when(loggerMock.isDebugEnabled()).thenReturn(true);
doNothing().when(loggerMock).error(any(String.class));
...
}
मुझे पता करना चाहते हैं:
- मैं स्थिर
LoggerFactory.getLogger()
किसी भी वर्ग के लिए काम करने के लिए नकली कर सकते हैं? - मैं केवल
@Before
में चलाने के लिए प्रतीत होता हूं और इस प्रकार मैं प्रति विधि विशेषताओं को बदलने के लिए प्रतीत नहीं कर सकता। क्या इसके चारों ओर एक रास्ता है?
संपादित निष्कर्ष:
मैंने सोचा कि मैं पहले से ही इस की कोशिश की और यह काम did not:
when(LoggerFactory.getLogger(any(Class.class))).thenReturn(loggerMock);
लेकिन धन्यवाद, यह काम किया था।
हालांकि मैं करने के लिए अनगिनत रूपों की कोशिश की है:
when(loggerMock.isDebugEnabled()).thenReturn(true);
मैं loggerMock @Before
के बाहर अपने व्यवहार को बदलने के लिए नहीं मिल सकता है लेकिन यह केवल Coburtura के साथ होता है। क्लॉवर के साथ, कवरेज 100% दिखाता है लेकिन अभी भी कोई मुद्दा है।
@RunWith(PowerMockRunner.class)
@PrepareForTest({LoggerFactory.class})
public class ExampleServiceTests {
@Mock
private Logger loggerMock;
private ExampleServiceservice = new ExampleService();
@Before
public void performBeforeEachTest() {
PowerMockito.mockStatic(LoggerFactory.class);
when(LoggerFactory.getLogger(any(Class.class))).
thenReturn(loggerMock);
//PowerMockito.verifyStatic(); // fails
}
@Test
public void testIsDebugEnabled_True() throws Exception {
when(loggerMock.isDebugEnabled()).thenReturn(true);
doNothing().when(loggerMock).debug(any(String.class));
assertThat(service.getMessage(), is("Hello null: 0"));
//verify(loggerMock, atLeast(1)).isDebugEnabled(); // fails
}
@Test
public void testIsDebugEnabled_False() throws Exception {
when(loggerMock.isDebugEnabled()).thenReturn(false);
doNothing().when(loggerMock).debug(any(String.class));
assertThat(service.getMessage(), is("Hello null: 0"));
//verify(loggerMock, atLeast(1)).isDebugEnabled(); // fails
}
}
तिपतिया घास में मैं if(logger.isDebugEnabled()){
ब्लॉक के 100% कवरेज दिखाने:
public ExampleService{
private static final Logger logger =
LoggerFactory.getLogger(ExampleService.class);
public String getMessage() {
if(logger.isDebugEnabled()){
logger.debug("isDebugEnabled");
logger.debug("isDebugEnabled");
}
return "Hello world!";
}
...
}
तब मैं इस परीक्षण है:
मैं इस साधारण क्लास की है। लेकिन अगर मैं सत्यापित करने का प्रयास loggerMock
:
verify(loggerMock, atLeast(1)).isDebugEnabled();
मैं शून्य बातचीत मिलता है। मैंने भी कोशिश की; @Before
में लेकिन इसमें शून्य इंटरैक्शन भी हैं।
यह सिर्फ अजीब लगता है कि कोबर्टुरा if(logger.isDebugEnabled()){
दिखाता है क्योंकि 100% पूर्ण नहीं है, और क्लोवर करता है, लेकिन दोनों सहमत हैं कि सत्यापन विफल हो जाता है।
क्या आपने @MockPolicy की कोशिश की है? [यहां उदाहरण] (https://code.google.com/p/powermock/wiki/MockPolicies) EasyMock शैली mocks के लिए हैं लेकिन Mockito के लिए अनुकूलित किया जा सकता है। –