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

如何在 java junit 测试中使用模拟来模拟对函数的调用

徐文彬
2023-03-14

我有一个jUnit测试,测试我的一个函数。在这个函数中,我调用了另一个类的方法,我想用mockito模拟这个方法。然而,我似乎不能实际嘲笑这一点。下面是我的jUnit测试的样子:

@Test
public void testingSomething() throws Exception {

    mock(AuthHelper.class);
    when(new AuthHelper().authenticateUser(null)).thenReturn(true);

    Boolean response = new MainClassImTesting().test();
    assertTrue(response);
}

编辑:在我的MainClassImTesting()中。我正在调用的test()函数,它调用authenticateUser()并向它传递一个hashMap。

共有2个答案

欧阳正卿
2023-03-14

如果您想模拟任何A类型参数的函数调用,只需执行

AuthHelper authHelper = Mockito.mock(AuthHelper.class);
Mockito.when(authHelper.authenticateUser(any(A.class))).thenReturn(true);
万乐逸
2023-03-14

Mockito将允许您创建一个模拟对象,并让它的方法返回预期的结果。因此,在这种情况下,如果您希望模拟的AuthHelper实例的authenticateUser方法返回true,而不管HashMap参数的值如何,您的代码将如下所示:

AuthHelper mockAuthHelper = mock(AuthHelper.class);
when(mockAuthHelper.authenticateUser(any(HashMap.class))).thenReturn(true);

然而,除非您的模拟对象具有访问或引用权限,否则它对MainClassImTesting没有用处。您可以通过将AuthHelper添加到MainClassImTesting的构造函数来实现这一点,这样类(包括您的测试方法)就可以访问它。

MainClassImTesting unitUnderTest = new MainClassImTesting(mockAuthHelper);
Boolean response = unitUnderTest.test();
assertTrue(response);

或者如果您的测试方法是唯一需要AuthHelper的方法,您可以简单地将AuthHelper作为方法参数。

MainClassImTesting unitUnderTest = new MainClassImTesting();
Boolean response = unitUnderTest.test(mockAuthHelper);
assertTrue(response);
 类似资料:
  • 我正在尝试测试一种使用hibernate、junit和mocking连接到db的方法 这是我的代码 UserDAO. java UserDAOImpl。Java语言 TestUserDAOImpl 测试用例向db添加了一组用户名和密码,但当我尝试使用返回结果时,它会返回一个空列表。 有人能帮我解决这个问题吗?

  • 我正在尝试模拟静态函数(getBatchId()和sendPost())以获得以下代码: 上述方法的单元测试用例代码:

  • 让我向您展示getCurrentWeatherWithForecastUsecase类actgually是什么样子: } //这很容易,它只需要一个天气存储库,并要求它获取结果。我把它发送回调用者,调用者将显示它。 更新: 以下是故障的整个堆栈跟踪:

  • 问题内容: 我知道关于模拟和测试有很多问题,但是我发现没有任何问题可以完美地帮助我,因此我仍然对理解以下内容有疑问: 如果我弄错了,请纠正我,但据我所知,单元测试用于隔离测试一个特定类的业务逻辑,并且如果有外部需要的任何对象,它们将被模拟。因此,例如,如果我有一个简单城市居民的管理系统,该系统将居民添加到列表中并按姓名返回居民(假设:居民仅包含一些基本个人信息),如下所示: 如果现在我要进行单元测

  • 出于学校目的,我正在创建一个使用股票API的应用程序。 我正在尝试为一种获取过去10年所有股票数据的方法编写一个测试。我不想实际获取所有这些数据,而是想抛出一个异常。 我想测试的方法: 股票时间系列(....)调用可以抛出阿尔法仓位异常。 我这样嘲弄了TimeSeries类: 在我的测试类中,我想模拟这个调用,并返回一个异常而不是实际数据。 无论我多么试图嘲笑这段代码,它永远不会抛出异常。它将始终