为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Mockito 中使用 stub() 方法?

如何在 Mockito 中使用 stub() 方法?

拉丁的传说 2021-09-26 16:53:38
我正在学习 Mockito 并尝试使用 stub() 方法。我有一个简单的代码,但它不起作用,因为我收到了这个错误:“SpyTest 类型的方法 stub(int) 是未定义的”。我想知道我应该在 pom 文件中添加什么依赖项才能使用这个 stub() 方法?先感谢您!这是代码:package com.dgs.mockito;import static org.junit.jupiter.api.Assertions.*;import static org.mockito.Mockito.mock;import java.util.ArrayList;import java.util.List;import org.junit.jupiter.api.Test;class SpyTest {    @Test    void test() {        List arrayListMock = mock(ArrayList.class);        assertEquals(0, arrayListMock.size());        stub(arrayListMock.size()).toReturn(5);    }}这是 pom 文件:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.dgs.mockito</groupId>  <artifactId>mockito-example</artifactId>  <version>0.0.1-SNAPSHOT</version>    <properties>        <maven.compiler.source>1.8</maven.compiler.source>        <maven.compiler.target>1.8</maven.compiler.target>    </properties>    <dependencies>              <dependency>            <groupId>org.hamcrest</groupId>            <artifactId>hamcrest-library</artifactId>            <version>1.3</version>            <scope>test</scope>        </dependency>         <dependency>            <groupId>org.junit.jupiter</groupId>            <artifactId>junit-jupiter-api</artifactId>            <version>5.3.1</version>            <scope>test</scope>         </dependency>         <dependency>           <groupId>org.junit.jupiter</groupId>           <artifactId>junit-jupiter-engine</artifactId>           <version>5.3.1</version>        </dependency>我正在看 Udemy 的教程,他正在使用这种存根方法。如果我尝试手动添加导入,我会收到此错误:“无法解析导入 org.mockito.Mockito.stub”。我想我需要在 pom 文件中添加另一个依赖项。
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

这里:

stub(arrayListMock.size()).toReturn(5);

您正在调用一个需要 int 参数的方法。但是您既没有声明也没有导入这样的方法。编译器不知道您要做什么。

正确的方法是:

when(arrayListMock.size()).thenReturn(5);

when()从 Mockito导入后)。

需要了解的重要一点:Mockito 的“模拟”和“存根”之间没有具体区别。您只需用于when(mock.someMethod())启动模拟规范。stub()Mockito 中没有方法!

然后:请注意,Mockito 中的spymock是有区别的。模拟是一个完全“虚拟”的对象,与真实代码没有任何关系。间谍更像是一个包装器,Mockito 将它“围绕”在被测类的真实对象周围。您的测试名为SpyTest,但它没有使用间谍。如果它会使用间谍,事情就不同了。

当然,真正的真正答案是:您永远不会模拟列表。您只需创建一个真正的列表,并用您需要在其中的元素填充它。也许您放入列表中的对象是模拟的,但是模拟列表本身的需求为零

相反:这是不好的做法。您尝试尽量减少您使用的模拟量。


查看完整回答
反对 回复 2021-09-26
?
慕标5832272

TA贡献1966条经验 获得超4个赞

尝试


@Test

void test() {


    List arrayListMock = mock(ArrayList.class);

    doReturn(5).when(arrayListMock ).size();

    assertEquals(5, arrayListMock.size());


}


查看完整回答
反对 回复 2021-09-26
  • 2 回答
  • 0 关注
  • 274 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信