代码之家  ›  专栏  ›  技术社区  ›  rilent

如何在junit的catch子句中覆盖我的记录器

  •  0
  • rilent  · 技术社区  · 6 年前

    我正在尝试对我的应用程序进行一次完整的junit测试,在测试logger消息时遇到了麻烦。

    try {
        fillParameters(args);
    } catch (ArgumentException e) {
        logger.error(e.getMessage(), e);
        return;
    }
    

    if (args.length > 3) {
        throw new ArgumentException("Wrong use of the command -> too many args"); 
    }
    

    @Test
    public void testFillParametersWithTooManyArguments() {
        String[] args = { "...", "...", "...", "..." };
        Throwable e = null;
        try {
            testInstance.fillParameters(args);
        } catch (Throwable ex) {
            e = ex;
        }
        assertTrue(e instanceof ArgumentException); //this test is working as expected
    }
    

    当我查看代码覆盖率时,logger.error(e.getMessage(),e);部分未涵盖,我该如何涵盖它?我想我一定要嘲笑伐木工人?

    1 回复  |  直到 6 年前
        1
  •  0
  •   DwB    6 年前

    简短的回答
    测试实际要测试的代码。

    一些信息
    您的第一个代码块中的代码绝不会被示例单元测试中的代码测试。 我假设因为它看起来像Java代码,而问题被标记为Java问题,所以第一个代码块中的代码实际上在某个方法中。 必须对该方法进行单元化,才能在该方法的异常捕获块中获得测试覆盖率。

    public void IHateToTellPeopleMyMethodName(final String[] args)
    {
        try
        {
            fillParameters(args);
        }
        catch (ArgumentException e)
        {
            logger.error(e.getMessage(), e);
            return;
        }
    }
    

    为了在 IHateToTellPeopleMyMethodName 方法, iHatTotellPeopleMyMethodName方法 单元测试中的方法。

    iHatTotellPeopleMyMethodName方法 方法,因为它不调用 iHatTotellPeopleMyMethodName方法 方法。

    @Test
    public void testThatInNoWayTestsTheIHateToTellPeopleMyMethodNameMethod()
    {
        String[] args = { "...", "...", "...", "..." };
    
        try
            {
            testInstance.fillParameters(args);
                    fail("expected exception not thrown");
        }
            catch (Throwable ex)
            {
                assertTrue(e instanceof ArgumentException);
        }
    }
    

    与上面的单元测试代码不同, 这个单元测试包括 iHatTotellPeopleMyMethodName方法 方法。

    @Test
    public void testTheIHateToTellPeopleMyMethodNameMethod()
    {
        String[] args = { "...", "...", "...", "..." };
    
        testInstance.IHateToTellPeopleMyMethodName(args);
    
              verify(mockLogger).error(
                    eq(EXPECTED_MESSAGE_TEXT),
                        any(ArgumentException.class));
    }
    

    编辑注释
    我的错, any() class 不是类名。