使用Mockito

时间:2017-02-22 11:42:05

标签: java junit mockito inject

我正在尝试使用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(不确定这是否重要,但无论如何都要说)。

2 个答案:

答案 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