使用 Mockito 设置单元测试
Setting up an unit test with Mockito
我正在尝试使用 mockito 为注入设置一个简单的单元测试。这个项目只是我朋友为他的项目所做的测试的概念证明。
我遇到的问题是我从调用的方法中得到的是 null 而不是 "Hello World"。此外,当我调试时,我进入了一个名为 MethodInterceptorFilter
的 class,它调用方法 intercept
并将 IndexOutOfBoundsExpetion
作为其参数之一。
有人知道我做错了什么吗?
DAO:
@Stateless
public interface DAO {
public String helloWorld();
}
DAO 实现:
@Stateless
public class DAOImpl implements DAO{
public String helloWorld() {
return "Hello World";
}
}
服务:
@Stateless
public class Service {
@Inject
private DAO dao;
public String helloWorld() {
return dao.helloWorld();
}
}
测试:
public class RandomTest {
@InjectMocks
Service service = new Service();
@Mock
DAO dao;
@Before
public void init(){
MockitoAnnotations.initMocks(this);
}
@Test
public void testTest() {
assertEquals("Hello World", service.helloWorld());
}
}
顺便说一下,我正在使用 IntelliJ(不确定这是否重要,但无论如何都要说)。
DAO class 在您的服务 class 中被模拟,您需要指定要模拟的 return 对象。
@Test
public void testTest() {
when(dao.helloWorld()).thenReturn("Hello World")
assertEquals("Hello World", service.helloWorld());
}
或者你可以使用构造注入:
@Stateless
public class Service {
private DAO dao;
@Inject
public Service(DAO dao) {
this.dao = dao;
}
public String helloWorld() {
return dao.helloWorld();
}
}
public class RandomTest {
Service service;
@Before
public void init(){
service = new Service(new DAOImpl());
}
@Test
public void testTest() {
assertEquals("Hello World", service.helloWorld());
}
}
或者反射,比如在Spring里面有一个实用程序classhttp://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/util/ReflectionTestUtils.html
首先,'@InjectMocks'
创建了一个 class 的实例并注入了用 '@Mock'
(或 '@Spy'
)注释注释的模拟,因此尝试删除@Before
方法,或者手动注入它们但删除 @InjectMocks
注释。
其次,'@Mock'
classes 是 classes 扩展你的 classes 并且不实现任何方法(return null
), 要为需要用
存根的方法配置行为
when(...).thenReturn()
或者如果使用 BDD
given(...).willReturn()
如果你正在尝试使用 a'@Spy'
存根 void 方法,最后你需要在测试中使用 runner '@RunWith(MockitoJUnitRunner.class)'
注释 class 如果使用 Mockito 作为 JUnit 测试跑步者(默认跑步者)对 Mockito 一无所知。
我正在尝试使用 mockito 为注入设置一个简单的单元测试。这个项目只是我朋友为他的项目所做的测试的概念证明。
我遇到的问题是我从调用的方法中得到的是 null 而不是 "Hello World"。此外,当我调试时,我进入了一个名为 MethodInterceptorFilter
的 class,它调用方法 intercept
并将 IndexOutOfBoundsExpetion
作为其参数之一。
有人知道我做错了什么吗?
DAO:
@Stateless
public interface DAO {
public String helloWorld();
}
DAO 实现:
@Stateless
public class DAOImpl implements DAO{
public String helloWorld() {
return "Hello World";
}
}
服务:
@Stateless
public class Service {
@Inject
private DAO dao;
public String helloWorld() {
return dao.helloWorld();
}
}
测试:
public class RandomTest {
@InjectMocks
Service service = new Service();
@Mock
DAO dao;
@Before
public void init(){
MockitoAnnotations.initMocks(this);
}
@Test
public void testTest() {
assertEquals("Hello World", service.helloWorld());
}
}
顺便说一下,我正在使用 IntelliJ(不确定这是否重要,但无论如何都要说)。
DAO class 在您的服务 class 中被模拟,您需要指定要模拟的 return 对象。
@Test
public void testTest() {
when(dao.helloWorld()).thenReturn("Hello World")
assertEquals("Hello World", service.helloWorld());
}
或者你可以使用构造注入:
@Stateless
public class Service {
private DAO dao;
@Inject
public Service(DAO dao) {
this.dao = dao;
}
public String helloWorld() {
return dao.helloWorld();
}
}
public class RandomTest {
Service service;
@Before
public void init(){
service = new Service(new DAOImpl());
}
@Test
public void testTest() {
assertEquals("Hello World", service.helloWorld());
}
}
或者反射,比如在Spring里面有一个实用程序classhttp://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/util/ReflectionTestUtils.html
首先,'@InjectMocks'
创建了一个 class 的实例并注入了用 '@Mock'
(或 '@Spy'
)注释注释的模拟,因此尝试删除@Before
方法,或者手动注入它们但删除 @InjectMocks
注释。
其次,'@Mock'
classes 是 classes 扩展你的 classes 并且不实现任何方法(return null
), 要为需要用
when(...).thenReturn()
或者如果使用 BDD
given(...).willReturn()
如果你正在尝试使用 a'@Spy'
存根 void 方法,最后你需要在测试中使用 runner '@RunWith(MockitoJUnitRunner.class)'
注释 class 如果使用 Mockito 作为 JUnit 测试跑步者(默认跑步者)对 Mockito 一无所知。