【问题标题】:JUnit failure when mocking Logger模拟 Logger 时 JUnit 失败
【发布时间】:2017-09-27 12:14:49
【问题描述】:

我要测试的班级是HostApi,带有静态记录器。

public class HostApi {
     String baseUrl;

     private static Logger logger=LogFactory.getLogger(HostApi.class);

     /**
      * Constructor
      * 
      * @param baseUrl
      *            - protocol + "://" + dockerIp + ":" + dockerPort Example -
      *            http://192.168.99.100:2375
      */
     public HostApi(String baseUrl) {
      this.baseUrl = baseUrl;
     }

     HostRestClient client;

     public Container getContainerInfo(String containerId) throws IOException, AgentException {
       logger.debug("############# getContainerInfo start ###################"); //$NON-NLS-1$
        String output;
        String path = "/containers/" + containerId + "/json"; //$NON-NLS-1$ //$NON-NLS-2$
        client = new HostRestClient();
        output = client.processGetRequest(baseUrl + path);

        logger.trace(output);
        ObjectMapper mapper = new ObjectMapper();
        Container container = mapper.readValue(output, Container.class);
        logger.debug("############# getContainerInfo end ###################\n\n"); //$NON-NLS-1$
        return container;
     }
}

我的 JUnit 测试类是HostApiTest

@RunWith(PowerMockRunner.class)
@PrepareForTest({HostApi.class,ObjectMapper.class,LogFactory.class})
public class HostApiTest {
     HostApi hp;
     static Logger logger;

     @BeforeClass
     public static void before()
     {
         System.out.println("Before Class");
     }

     @AfterClass
     public static void after() {
         System.out.println("After Class");
     }

     @Mock
     Logger loggermock;

     @Before()
     public void setUp() { 
     mockStatic(LogFactory.class);
         EasyMock.expect(LogFactory.getLogger(HostApi.class)).andReturn(loggermock    );

     //logger=createMock(Logger.class);
     // Whitebox.setInternalState(HostApi.class, logger);

       hp=new HostApi("skj"); //$NON-NLS-1$
     }

     @Test
     public void testgetContainerInfo() throws Exception{
       System.out.println("abc");

       HostRestClient client=PowerMock.createMock(HostRestClient.class);
       ObjectMapper obj=PowerMock.createMock(ObjectMapper.class);
       Container container=new Container();
       container.setId("234");
       String containerData=container.toString();    
       PowerMock.expectNew(ObjectMapper.class).andReturn(obj); 
       PowerMock.expectNew(HostRestClient.class).andReturn(client);
      EasyMock.expect(client.processGetRequest(EasyMock.isA(String.class))).andReturn(containerData);         
     EasyMock.expect(obj.readValue(EasyMock.isA(String.class),EasyMock.same(Container.class))).andReturn(container);  
         replayAll();    
      assertEquals("234",hp.getContainerInfo("25").getId());  
         EasyMock.verify();
     }
}

如果代码中没有logger(即在HostApi 中注释掉)它可以工作,但是在添加logger 后它会引发断言错误

我添加了 logfactory 的静态模拟,但它似乎不起作用。

我在嘲笑时做错了什么?我只能使用 powermock。

【问题讨论】:

    标签: unit-testing logging junit mockito powermock


    【解决方案1】:

    删除...

    • LogFactory.class 来自 @PrepareForTest({...}) 注释
    • @Mock Logger loggermock; 来自HostApiTest
    • mockStatic(LogFactory.class); 来自HostApiTest
    • EasyMock.expect(LogFactory.getLogger(HostApi.class)).andReturn(loggermock); 来自HostApiTest

    您的测试用例对HostApi 的记录器的行为没有任何期望或断言,因此无需模拟它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      相关资源
      最近更新 更多