【发布时间】: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 的要求注入您的模拟(我不确定,可能有必要将这些字段公开)。