【问题标题】:No dependencies injection using mockito不使用 mockito 进行依赖注入
【发布时间】:2019-06-25 22:25:36
【问题描述】:

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

我的测试班:

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());
        }
    }
}

班级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();
    }
}

班级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>

【问题讨论】:

  • 当你用@Mock 标记一个字段时,你不应该分配它的值。分配是通过在您的 @Before 方法中调用 MockitoAnnotations.initMocks(this) 来完成的。编写代码时,其中没有模拟,只有真实实例。
  • 相同的 MockitoAnnotations.initMocks(this) 也会按照@InjectMocks 的要求注入您的模拟(我不确定,可能有必要将这些字段公开)。

标签: java mockito junit5


【解决方案1】:

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

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

package stackoverflow;

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)

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

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

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

package stackoverflow;

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());
        }
    }
}

有用的链接

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

【讨论】:

  • @ExtendWith(MockitoExtension.class) 解决了我的问题,将 @RunWith(MockitoJUnitRunner.class) 与 JUnit4 一起使用会由于某种原因出现异常。谢谢
【解决方案2】:

试试这个,它对我有用

您必须将爱好设置为 personOne 才能链接它们,在您的情况下 hobbie 和 personOne 没有链接

@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() );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2015-09-26
    • 2014-01-19
    • 2014-03-25
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多