java mockito无法创建类型 问题描述

java mockito无法创建类型 问题描述,java,mockito,Java,Mockito,当我尝试一些mockito教程中的代码时,我会遇到问题。下面,请查看必要的代码和错误,包括pom.xml和堆栈跟踪 My pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.

当我尝试一些mockito教程中的代码时,我会遇到问题。下面,请查看必要的代码和错误,包括pom.xml堆栈跟踪


My pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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.test</groupId>
        <artifactId>service</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.5.RELEASE</version>
        </parent>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.4</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-activemq</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>activemq-broker</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
                <version>2.25.1</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.1.1.RELEASE</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.liquibase/liquibase-maven-plugin -->
            <!--<dependency>-->
                <!--<groupId>org.liquibase</groupId>-->
                <!--<artifactId>liquibase-maven-plugin</artifactId>-->
                <!--<version>3.6.2</version>-->
            <!--</dependency>-->
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

我的堆栈跟踪: 堆栈跟踪如下所示:

org.mockito.exceptions.base.MockitoException: 

Mockito cannot mock this class: interface java.util.Iterator.

Mockito can only mock non-private & non-final classes.
If you're not sure why you're getting this error, please report to the mailing list.


Java               : 1.8
JVM vendor name    : Oracle Corporation
JVM vendor version : 25.162-b12
JVM name           : Java HotSpot(TM) 64-Bit Server VM
JVM version        : 1.8.0_162-b12
JVM info           : mixed mode
OS name            : Windows 10
OS version         : 10.0
Underlying exception : java.lang.IllegalArgumentException: Could not create type

我的问题是:
  • 你知道这种行为的原因是什么吗

  • 我如何解决这个问题


    • 如果您遵守以下规定,您的问题很容易解决:

      • 不要模仿你没有的类型
      • 不要模拟值对象
      • 不要嘲笑一切
      • 用你的测试来表达爱
      请务必阅读详细的解释,为什么你不应该

      提示:特别是对于JVM中的集合或集合相关类,像使用
      next()
      那样模拟一个方法是不够的,还必须对
      hasNext()
      进行一致的模拟,以防止错误的唤醒。:-)

      因此,您的测试将收缩为类似以下内容:

      @Test
      public void update() {
          Iterator i = List.of("Hello", "World").iterator();
          String result = i.next() + " " + i.next();
          assertEquals("Hello World", result);
      }
      
      如果您在“1.让我们验证一些行为!”一节中进一步阅读,该节说:

      下面的示例模拟了一个列表,因为大多数人都熟悉该接口(例如add()、get()、clear()方法)实际上,请不要嘲笑List类。请改用真实的实例。


      您可能会看到由stacktrace下面的错误,给你真正的原因。

      你为什么要模仿迭代器?因为它在教程中,可能应该可以工作。我面临着嘲笑我的班级的问题。所以,为了确定是我的类还是mockito的问题,我决定尝试一些教程中的示例。亲爱的mle,问题是“教程中的示例不适用于我的原因是什么”。不是“我应该用mockito来模拟迭代器吗?”。我已经试着去模仿我自己的很多课程,结果总是一样的。你的回答并不能解决任何问题!!!并在mockito官方网站上给出了吸烟清单的例子。List mockedList=mock(List.class);不,请不要坚持Mockito第一页的第一个例子!请进一步阅读“第1部分,让我们验证一些行为”的警告,说:“下面的例子模拟了一个列表,因为大多数人都熟悉界面(如Adter()、GET()、Car())。实际上,请不要嘲笑列表类。使用一个真实的实例来代替。“请参阅我的更新答案,这同样适用于
      迭代器
      。如果仍要模拟
      迭代器
      ,请检查
      Mockito
      版本。对于
      2.23.x
      ,您问题中的示例对我来说是开箱即用的。
      @Test
      public void update() {
          Iterator i = List.of("Hello", "World").iterator();
          String result = i.next() + " " + i.next();
          assertEquals("Hello World", result);
      }