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

时间:2018-09-17 14:33:00

标签: java junit mockito stub

我正在学习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文件中添加另一个依赖项。

2 个答案:

答案 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());

}