Java 使用Mockito设置单元测试
我试图用mockito为注入建立一个简单的单元测试。这个项目只是我朋友为他的项目做的一个测试的概念证明 我遇到的问题是,我从调用的方法中得到null,而不是“helloworld”。另外,当我调试时,我会进入一个名为Java 使用Mockito设置单元测试,java,junit,mockito,inject,Java,Junit,Mockito,Inject,我试图用mockito为注入建立一个简单的单元测试。这个项目只是我朋友为他的项目做的一个测试的概念证明 我遇到的问题是,我从调用的方法中得到null,而不是“helloworld”。另外,当我调试时,我会进入一个名为MethodInterceptorFilter的类,该类调用方法intercept,并将IndexOutOfBoundsExpetion作为其参数之一 有人知道我做错了什么吗 DAO: @Stateless public interface DAO { public Str
MethodInterceptorFilter
的类,该类调用方法intercept
,并将IndexOutOfBoundsExpetion
作为其参数之一
有人知道我做错了什么吗
DAO:
@Stateless
public interface DAO {
public String helloWorld();
}
@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());
}
}
DAO实现:
@Stateless
public interface DAO {
public String helloWorld();
}
@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());
}
}
服务:
@Stateless
public interface DAO {
public String helloWorld();
}
@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());
}
}
测试:
@Stateless
public interface DAO {
public String helloWorld();
}
@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类,您需要指定要模拟的返回对象
@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中有一个实用程序类,首先,
'@InjectMocks'
创建该类的一个实例,并注入带有'@Mock'
(或'@Spy'
)注释的Mock,因此尝试删除@Before
方法,或者手动注入它们,但删除@InjectMocks
注释
其次,“@Mock”
类是扩展类的类,不实现任何方法(returnnull
),用于为需要存根的方法配置行为
when(...).thenReturn()
或者如果使用BDD
given(...).willReturn()
如果您正在存根void方法,请尝试使用
“@Spy”
,最后您需要在测试类上使用runner“@RunWith(MockitoJUnitRunner.class)
注释,如果使用Mockito作为JUnit测试运行程序(默认运行程序),您对Mockito一无所知。首先,“@InjectMocks”创建类的实例,并将使用“@Mock”(或“@Spy”)注释创建的Mock注入到此实例中,因此请尝试删除before方法。其次,“@mock”类是扩展类的类,不实现任何方法,用于在(…)时为需要存根的方法指定行为。如果要存根void方法,请尝试使用“@Spy”,最后需要使用运行程序“@RunWith(MockitoJUnitRunner.class)'测试类上的注释。@Krystian_K您的解决方案与Yoav Gur(他刚刚删除)的解决方案结合使用,谢谢@如果你把你的评论变成答案,我会接受的