使用 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 一无所知。