没有使用 mockito 的依赖项注入

No dependencies injection using mockito

我正在尝试编写 Mockito 测试,不幸的是出了点问题。 我的class如下:

我的测试class:

import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;

public class TestClass {

    @Nested
    public class testingPersonClass{

        @InjectMocks
        public Person personOne = new Person("zakzak", 37);

        @Mock
        public  Hobbie hobbie = new Hobbie("Sport");

        @Test
        public void tesOne(){
            System.out.println("personOne "+personOne.toString());
        }
    }
}

class Person:

public class Person {

    String name;
    int age;
    Hobbie hobbie;


    Person(String name, int age){
        this.age=age;
        this.name=name;
    }

   //getters and setters

    @Override
    public String toString() {
        return this.name+" "+this.age+" "+ this.hobbie.toString();
    }
}

class Hobbie:

public class Hobbie {

    String hobbie;

    public Hobbie( String hobbie ) {
        this.hobbie = hobbie;
    }

    @Override
    public String toString() {
        return this.hobbie;
    }
}

我得到一个

java.lang.NullPointerException,

因为hobbie对象还没有注入到personOne对象中

我该如何解决?

我的 Pom 依赖项:

    <dependencies>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.23.4</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.1.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

您应该使用以下选项之一在单元测试中初始化 Mockito 模拟:

选项 1:在 @BeforeEach@Before 在 JUnit 4 中)方法

package Whosebug;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class TestClass {

    @Nested
    public class testingPersonClass {

        @InjectMocks
        public Person personOne = new Person("zakzak", 37);

        @Mock
        public Hobbie hobbie = new Hobbie("Sport");


        @BeforeEach
        public void init() {
            MockitoAnnotations.initMocks(this);
        }

        @Test
        public void testOne() {
            System.out.println("personOne " + personOne.toString());
        }
    }
}

选项 2:使用 @ExtendWith(MockitoExtension.class)(JUnit 4 中的 @RunWith(MockitoJUnitRunner.class)

注释您的测试 class

对于此方法,您必须将以下依赖项添加到 pom.xml:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>2.23.0</version>
    <scope>test</scope>
</dependency>

请注意,我已经注释掉了 init 方法。

package Whosebug;

import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class TestClass {

    @Nested
    public class testingPersonClass {

        @InjectMocks
        public Person personOne = new Person("zakzak", 37);

        @Mock
        public Hobbie hobbie = new Hobbie("Sport");


/*
        @BeforeEach
        public void init() {
            MockitoAnnotations.initMocks(this);
        }
*/

        @Test
        public void testOne() {
            System.out.println("personOne " + personOne.toString());
        }
    }
}

有用的链接

您会发现这些文章很有帮助:

试试这个,对我有用

你必须将 hobbie 设置为 personOne 才能 link 他们,在你的情况下 hobbie 和 personOne 不是 linked

@RunWith(MockitoJUnitRunner.class)
public class TestClass {


    @InjectMocks
    public Person personOne = new Person("zakzak", 37);

    @Autowired
    public Hobbie hobbie = new Hobbie("Sport");

    @Test
    public void tesOne(){

        personOne.setHobbie(hobbie);
        System.out.println(personOne.toString());
        Assert.assertEquals("zakzak 37 Sport",personOne.toString() );
    }
}