首页 > 解决方案 > 编写需要 2 个列表的单元测试

问题描述

我是一个新的 Junit Learner 我想根据 2 列表类测试我的代码。但是,我从未见过任何例子。

我的真实代码如下:

public static List<JourneyType> applyFilter(List<JourneyType> journeyList, List<AvailabilityFilterOptionType> filterOptions)
{
    List<JourneyType> filteredJourneyList = new ArrayList<>();

    filteredJourneyList = applyStopFilters(journeyList, filterOptions);
    filteredJourneyList = applyCarrierFilters(filteredJourneyList, filterOptions);
    filteredJourneyList = applyRbdFilters(filteredJourneyList, filterOptions);
    filteredJourneyList = applyDurationFilter(filteredJourneyList, filterOptions);
    return filteredJourneyList;
}

和我的测试场景:

@Test
public void testApplyFilter() 
{
    fail("Not yet implemented");
}

谢谢先进

标签: javaspringjunit

解决方案


实际上,这很简单。

@Test
public void testApplyFilter() 
{
    assertThat(someObject.applyFilter(journies, filters), is(expectedOutcome));
}

换句话说:你知道这个方法应该做什么。(嗯,这些知识是测试东西的先决条件。当你不知道你的代码在做什么时,通过测试来验证它的正确性是没有意义的......)

如:给定一些已知的输入数据,您应该能够对输出返回的期望值。这就是您要检查的内容。

当然,棘手的部分可能是正确识别依赖关系,并在需要时模拟它们。

但理想情况下,您的测试应该只是:测试您的被测方法的公共合约。有东西进入,您检查返回的输出是否符合您的期望。理想情况下,您不必为此类测试模拟任何内容,因为您根本不依赖测试实现细节。你只测试公共合约“给定这个输入,这是预期的输出”。

( where:assertThat()只是一种不同类型的断言,并且is()是一个hamcrest匹配器。还有许多其他 hamcrest 匹配器,例如containsInAnyOrder()( 如果您不关心返回的元素的顺序,那一个真的很整洁,但必须了解使用方式略有不同,需要containsInAnyOrder(expectedOutcomeList.toArray())methinks)


推荐阅读