我正在尝试使用mockito为注入设置一个简单的单元测试。这个项目只是我朋友为他的项目做的测试的概念证明。
我遇到的问题是我从我正在调用的方法而不是“Hello World”中获取null。另外,当我调试时,我进入一个名为MethodInterceptorFilter
的类,它调用方法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(不确定这是否重要,但无论如何都要说)。
答案 0 :(得分:2)
首先,'@InjectMocks'
创建该类的实例并注入使用'@Mock'
(或'@Spy'
)注释注释的模拟,因此尝试删除@Before
方法,或者手动注入它们但删除@InjectMocks
注释。
其次,'@Mock'
类是扩展类的类,不实现任何方法(返回null
),为你需要的方法配置行为
when(...).thenReturn()
或使用BDD
given(...).willReturn()
如果您正在使用void方法,请尝试使用'@Spy'
,最后如果使用Mockito作为JUnit测试运行器(默认情况下),则需要在Test类上使用runner '@RunWith(MockitoJUnitRunner.class)'
注释跑者)对Mockito一无所知。
答案 1 :(得分:0)
在您的Service类中模拟DAO类,您需要指定要返回的返回对象。
@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中有一个实用工具类http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/util/ReflectionTestUtils.html