не мог создать тип - PullRequest
       2

не мог создать тип

2 голосов
/ 19 марта 2019

Описание проблемы

Я сталкиваюсь с проблемой, когда пробую коды из некоторого учебника mockito . Ниже приведены необходимые коды и ошибки, в том числе pom.xml и трассировка стека .


Мой 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>


import com.google.common.base.Charsets;
import com.google.common.io.Resources;
import org.junit.Test;
import org.mockito.Mock;
import java.util.Iterator;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class ParserTest {

    @Test
    public void update() throws IOException {
        Iterator i = mock(Iterator.class);
        when(i.next()).thenReturn("Hello").thenReturn("World");
        String result = i.next()+" "+i.next();
        assertEquals("Hello World", result);
    }
}

My Stack Trace:

Трассировка стека выглядит следующим образом:

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

Мои вопросы:

  • Есть идеи, что может быть причиной такого поведения?

  • Как мне решить эту проблему?

1 Ответ

0 голосов
/ 19 марта 2019

Проблему, которую вы имеете, легко решить, если вы будете подчиняться Основным принципам насмешек Mockito :

  • Не издевайтесь над типами, которые вам не принадлежат
  • Не издевайся над ценными объектами
  • Не издевайся над всем
  • Покажи любовь своим испытаниям!

Пожалуйста, не забудьте также прочитать подробные объяснения, почему вы не должны макет типа [ов], которые вам не принадлежат .

Тизер: особенно для коллекций или связанных с коллекцией классов в 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.Вместо этого используйте реальный экземпляр."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...