Java 使用Mockito设置单元测试

Java 使用Mockito设置单元测试,java,junit,mockito,inject,Java,Junit,Mockito,Inject,我试图用mockito为注入建立一个简单的单元测试。这个项目只是我朋友为他的项目做的一个测试的概念证明 我遇到的问题是,我从调用的方法中得到null,而不是“helloworld”。另外,当我调试时,我会进入一个名为MethodInterceptorFilter的类,该类调用方法intercept,并将IndexOutOfBoundsExpetion作为其参数之一 有人知道我做错了什么吗 DAO: @Stateless public interface DAO { public Str

我试图用mockito为注入建立一个简单的单元测试。这个项目只是我朋友为他的项目做的一个测试的概念证明

我遇到的问题是,我从调用的方法中得到null,而不是“helloworld”。另外,当我调试时,我会进入一个名为
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”
类是扩展类的类,不实现任何方法(return
null
),用于为需要存根的方法配置行为

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(他刚刚删除)的解决方案结合使用,谢谢@如果你把你的评论变成答案,我会接受的