java - 如何测试使用其他方法的方法 - Mockito、java、junit

标签 java junit

我想测试使用另一种方法?我尝试使用 Mockito 执行此操作,如下所示:

编辑:完整方法

public String createUrlAddress(TypeOfInformation typeOfInformation, String icao) {
    switch (typeOfInformation) {
        case METAR:
            urlAddress = StaticValues.MAIN_URL_ADDRESS_FOR_METAR + icao;
            break;
        case TAF:
            urlAddress = StaticValues.MAIN_URL_ADDRESS_FOR_TAF + icao + StaticValues.TAF_4_HOURS_BEFORE_NOW;
            break;
        case CITY_PAIR_METAR:
            urlAddress = StaticValues.MAIN_URL_ADDRESS_FOR_CITY_PAIRS
                    + pc.getDepartureAndArrivalTime().get("departureTime") //get departure time from hashmap
                    + StaticValues.END_TIME_STRING
                    + pc.getDepartureAndArrivalTime().get("arrivalTime")
                    + StaticValues.STATION_STRING
                    + pc.getOriginIcao()
                    + ","
                    + pc.getDestinationIcao()
                    + StaticValues.MOST_RECENT_FOR_TYPED_STATIONS;
            System.out.println(urlAddress);
            break;
        case CITY_PAIR_TAFS:
            urlAddress = StaticValues.MAIN_URL_ADDRESS_FOR_CITY_PAIRS_TAFS
                    + pc.getDepartureAndArrivalTime().get("departureTime")
                    + StaticValues.END_TIME_STRING
                    + pc.getDepartureAndArrivalTime().get("arrivalTime")
                    + StaticValues.STATION_STRING
                    + pc.getOriginIcao()
                    + ",%20"
                    + pc.getDestinationIcao()
                    + StaticValues.MOST_RECENT_FOR_TYPED_STATIONS_TAFS;
            System.out.println(urlAddress);
            break;
        default:
            System.out.println("Wrong Type of informations");
    }
    return urlAddress;
}

测试:

@Test
    public void forGivenTypeOfInformationAndIcaoReturnUrl() {
        HashMap<String,Long> departureAndArrivalTimeTest = new HashMap<>();
        departureAndArrivalTimeTest.put("departureTime", 1499264449L);
        departureAndArrivalTimeTest.put("arrivalTime", 1499282449L);
        PageControllerForNearestCity pcSpy = Mockito.spy(pc);
        Mockito.when(pcSpy.getDepartureAndArrivalTime()).thenReturn(departureAndArrivalTimeTest);

        Mockito.when(pcSpy.getOriginIcao()).thenReturn("EPWA");
        Mockito.when(pcSpy.getDestinationIcao()).thenReturn("EDDF");

        assertThat(StaticValuesForTest.URL_ADDRESS_FOR_CITY_PAIR_METAR).isEqualTo(xmlParser.createUrlAddress(TypeOfInformation.CITY_PAIR_METAR, "EPGD")); }

在这种情况下我该如何使用我的模拟?这是好方法还是我必须以其他方式来做?我想补充一点,我不会添加这些变量作为此方法的参数。

PS 我认为该方法只有一个职责,只是创建一个字符串,我错了吗?是否应该像“服务”一样分为另一种?

感谢您的支持

最佳答案

您的测试在实现细节中输入了太多内容。
您模拟方法自己的处理/逻辑。所以这使得测试变得脆弱,我们可以想知道你到底断言了什么。
此外,该测试的阅读和维护都很复杂。

最后,与每个案例相关的处理都很重要。这是你的方法的主要逻辑:

case CITY_PAIR_METAR:

   urlAddress = StaticValues.MAIN_URL_ADDRESS_FOR_CITY_PAIRS
        + pc.getDepartureAndArrivalTime().get("departureTime") //get departure time from hashmap
        + StaticValues.END_TIME_STRING
        + pc.getDepartureAndArrivalTime().get("arrivalTime") //get arrival time from hashmap
        + StaticValues.STATION_STRING
        + pc.getOriginIcao()
        + ","
        + pc.getDestinationIcao()
        + StaticValues.MOST_RECENT_FOR_TYPED_STATIONS;
   System.out.println(urlAddress);

应该在没有模拟的情况下对其进行测试,就像您实际所做的那样。

为此,您应该通过引入一个新类来分离职责。
实际的类应该只具有 Controller /调度程序角色,新类应该根据情况使用公共(public)方法执行逻辑。

通过这种方式,您所测试的类可以依赖于此类,并且您可以直接模拟它们。

您的实际方法最终可能如下所示:

private AddressService addressService;

public String createUrlAddress(TypeOfInformation typeOfInformation, String icao) {
                switch (typeOfInformation) {

        (...)
                    case CITY_PAIR_METAR:
                        urlAddress = addressService.createUrl();
                        break;
         (...)
                    default:
                        System.out.println("Wrong Type of informations");
                }

               return urlAddress;
 }

关于java - 如何测试使用其他方法的方法 - Mockito、java、junit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45020713/

相关文章:

Android 仪器测试 : unable to add a class to a folder androidTest/java

java - 有没有办法以编程方式更改手机上的 Mac 地址?

java - MVP(Android) 中的 Presenter 对象出现空对象引用错误

java - Spring 注入(inject)问题

Java、Spring Boot、测试、entityManagerFactory

java - 在单元测试中使用 AspectJ 用模拟替换第三方对象

java - Powermock:静态接口(interface)方法给出未完成的 stub 异常

java - 获取 DIY 链表类以抛出异常

java - JLabels 的鼠标监听器

java - JUnit4 : Test a shutdown hook is called