我正在学习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>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.21.0</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.21.0</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.2.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
我正在看Udemy的教程,他正在使用这种存根方法。如果我尝试手动添加导入,则会出现此错误:“无法解析导入org.mockito.Mockito.stub”。我想我需要在pom文件中添加另一个依赖项。
答案 0 :(得分:2)
这里:
stub(arrayListMock.size()).toReturn(5);
您正在调用需要int参数的方法。但是您既没有声明也没有导入这样的方法。编译器不知道您要做什么。
正确的方法是:
when(arrayListMock.size()).thenReturn(5);
(从Mockito导入when()
之后)。
要理解的重要事项:使用Mockito进行“模拟”和“存根”之间没有特定区别。您只需使用when(mock.someMethod())
即可启动模拟规范。 Mockito中没有stub()
方法!
然后:请注意,Mockito中的间谍和模拟之间是有区别的。模拟是完全“虚拟”的对象,它与真实代码没有任何关系。间谍更像是一个包装器,Mockito将其“包围”被测类的真实对象。您的测试名为SpyTest
,但不是使用间谍。如果要使用间谍,那就不一样了。
当然,真正的真实答案是:您永远不会模拟列表。您只需创建一个真实列表,然后在其中添加需要包含在其中的元素即可。也许您放入列表中的对象是模拟对象,但是有 zero 需要模拟列表本身。
相反:这是坏习惯。您尝试最小化您使用的模拟量。
答案 1 :(得分:-2)
尝试
@Test
void test() {
List arrayListMock = mock(ArrayList.class);
doReturn(5).when(arrayListMock ).size();
assertEquals(5, arrayListMock.size());
}