当前位置: 首页 > 知识库问答 >
问题:

如何使用Mockito消除外部依赖?

谭思博
2023-03-14

下面是我的html" target="_blank">代码:

// WeatherDemo.java:

package com.abc;

public class WeatherDemo {
    public String getForecast() {
        // Get the high remperature for today, and return back to the caller one of these values:
        // cold, mild, or hot
        // cold will be returned if the high temp is forecast to be less than 60.
        // hot will be returned if the high temp is forecast to be more than 79.
        // Otherwise, mild will be returned (this indicates a high temp in the 60s or 70s).
        int highTemp = getHighTemp();
        if (highTemp < 60)
            return("cold");
        if (highTemp > 79)
            return("hot");
        return("mild");
    }

    public int getHighTemp() {
        // Because this is a demo, we don't have access to any source (web service, DB, etc.) to get the high temp.
        // Just hard code a value here, but remember that if this were a real application, we would be dynamically
        //   retrieving the day's high temperature from some external source.
        int highTemp = 32;
        return(highTemp);
    }
}

===================================================================================================

// TestWeatherDemo.java:

package com.abc;

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.junit.Test;
import org.mockito.Mockito;

public class TestWeatherDemo {
    @Test
    public void testWeatherReport() {
        WeatherDemo testMockito = Mockito.mock(WeatherDemo.class);
        WeatherDemo testJUnit = new WeatherDemo();

        when(testMockito.getHighTemp()).thenReturn(90);
        assertEquals("hot", testJUnit.getForecast());
    }
}

===================================================================================================

Mockito背后的全部思想难道不是我可以模拟一个方法,并告诉它确切地返回什么,以消除外部依赖关系吗?如果从getForecast()调用getHightTemp()不会返回90,我就看不出Mockito的用途了。我在这里漏掉了什么?谢谢你的帮助和启迪。

账单

共有1个答案

左恺
2023-03-14

在您的示例中,TestMockitoTestJunit是不同的对象-您在TestMockito上模拟了方法,但是TestJunit有方法的实际实现,返回32。

您可能需要考虑将代码分成两个类,然后可以使gethightemp()中的代码成为主类的依赖项。这是在测试中提供模拟和实际运行代码的真正实现的地方。(也许通过某种依赖注入)

以这种方式构建的代码似乎遵循了单一责任原则--这样做的好处是,如果您需要更改天气数据供应商,它将使您的工作变得更加容易。我认为,当您说“因为这是一个外部资源,所以我的Junit没有通过隔离测试”时,您无论如何都是沿着这条线走的。

 类似资料:
  • 我尝试过在IntelliJ的project structure下通过库添加JAR,并只在根目录下的libs文件夹中添加JAR。首先,我提供了绝对路径,但后来我将其更改为${basedir},因为绝对路径没有映射为docker容器上的卷。有什么方法可以将外部jar与项目jar打包,以便在docker容器中使用它?

  • 我需要在我的maven项目中添加大约15个罐子,它在远程和中央存储库中都不可用。 然而,我实现了以下目标:, > 在我的项目路径中添加了jars(\src\lib) 将pom更改如下, 我的问题是: 我是否需要像上面那样分别对所有15个JAR重复它,或者我们有任何其他方法来绑定这些JAR并将其作为一个依赖路径? Maven在这里讨论了同样的事情:指向多个JAR的系统依赖性。但我想知道我是否能得到更

  • 如果我正在创建一个带有如下头文件的静态库: 在我自己的项目中,我可以告诉编译器(在我的例子中是Visual Studio)在哪里查找SomeHeaderFile.h。但是,我不希望我的用户关心这一点--他们应该能够包含我的头,而不必通知编译器SomeHeaderFile.h的位置。 这类情况通常如何处理?

  • 问题内容: 我有以下两个javascript函数: 1 2 我想将它们放在外部“ .js”文件中 1 2 调用这些函数的正确语法是什么? 问题答案: 像这样的代码 希望对您有帮助。…谢谢

  • 如您所知,Maven使用存储库的概念进行依赖关系管理。 但是,如果在任何远程存储库和中央存储库中都没有依赖项,会发生什么? Maven使用External Dependency概念为这种情况提供答案。 例如,让我们对“创建Java项目”一章中创建的项目进行以下更改。 将lib文件夹添加到src文件夹。 将任何jar复制到lib文件夹中。 我们使用了ldapjdk.jar ,它是LDAP操作的帮助库

  • 为类A编写单元测试时如何模拟外部依赖关系。当我以上述方式模拟依赖关系时,“a”的值没有按预期分配给100。