2017-02-22 105 views
1

我正在尝试使用mockito为注入设置一个简单的单元测试。这个项目只是我朋友为他的项目进行测试的一个概念验证。使用Mockito设置单元测试

我遇到的问题是我从我打电话而不是“Hello World”的方法中得到空值。另外,当我调试时,我进入一个名为MethodInterceptorFilter的类,它调用方法interceptIndexOutOfBoundsExpetion作为它的一个参数。

有人知道我在做什么错吗?

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(不知道的事项,但说也无妨)。

+1

首先,'@InjectMocks'创建该类的一个实例,并将使用'@Mock'(或'@Spy')注释创建的嘲讽注入此实例,因此尝试删除before方法。其次,'@mock'类是扩展你的类并且不实现任何方法的类,以指定你需要用when(...)存根的方法的行为。然后返回()如果你在使用'@Spy'来填充void方法,并且最后你需要在Test类中使用runner'@RunWith(MockitoJUnitRunner.class)'注解。 – LazerBanana

+0

@Krystian_K您的解决方案与Yoav Gur(他刚刚删除)的解决方案相结合,谢谢! –

+0

@Krystian_K如果你把你的评论变成答案,我会接受它 –

回答

2

首先,'@InjectMocks'创建类的实例,并注入了使用'@Mock'(或'@Spy')批注注释的嘲笑,因此尝试删除@Before方法,或手动注入它们,但删除@InjectMocks注释。

其次,'@Mock'类是扩展类,并没有实现任何方法(返回null),配置行为需要用

when(...).thenReturn() 

,或者使用存根它的方法类BDD

given(...).willReturn() 

如果你磕碰虚空方法尝试使用'@Spy'和最后你需要的,如果使用作为的Mockito JUnit测试R来使用亚军'@RunWith(MockitoJUnitRunner.class)'注释的测试类unner(这是默认的跑步者)对Mockito一无所知。

0

DAO类在你的Service类中被模拟,你需要指定返回对象来模拟。

@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()); 
    } 
} 

或反射,例如在春天有一个实用工具类http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/util/ReflectionTestUtils.html

相关问题