我有以下Logger我想模拟出来,但是验证日志条目是被调用的,而不是内容。使用PowerMock和Mockito嘲笑Logger和LoggerFactory
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()
为任何类工作? - 我似乎只能运行
when(loggerMock.isDebugEnabled()).thenReturn(true);
在@Before
,因此我似乎无法改变每个方法的特征。有没有解决的办法?
编辑发现:
我以为我想这已经和它没有工作:
when(LoggerFactory.getLogger(any(Class.class))).thenReturn(loggerMock);
但是谢谢你,因为它没有工作。
但是我已经试过无数的变化来:
when(loggerMock.isDebugEnabled()).thenReturn(true);
我不能让loggerMock改变@Before
以外的行为,但这只是与Coburtura发生。使用三叶草,覆盖率显示为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!";
}
...
}
然后,我有这个测试:
@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%覆盖。 但如果我尝试验证loggerMock
:
verify(loggerMock, atLeast(1)).isDebugEnabled();
我得到零个互动。 我也试过PowerMockito.verifyStatic()
;在@Before
但也有零交互。
这似乎很奇怪,Cobertura显示if(logger.isDebugEnabled()){
并非100%完整,而Clover确实如此,但都同意验证失败。
你试过了@MockPolicy吗? [示例](https://code.google.com/p/powermock/wiki/MockPolicies)适用于EasyMock风格的嘲笑,但可以适用于Mockito。 –