2013-05-15 141 views
17

嘿,我尝试为我的jsf应用程序和mock我使用mockito实施一些测试。 (我也用弹簧)Mockito模拟对象返回null

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

    private GeneralConfigService generalConfigService; 

    @Mock 
    private GeneralConfigDAO generalConfigDAO; 

    @Mock 
    private GeneralConfig gen; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     generalConfigService = new GeneralConfigService(); 
     ReflectionTestUtils.setField(generalConfigService, "generalConfigDAO", generalConfigDAO);     
    } 

    @Test 
    public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException { 
     gen = createGeneralConfigs("label", "value"); 

     generalConfigService.setInstance(gen); 
     generalConfigService.persist(); 
     log.info(generalConfigService.getInstance().toString()); 
    } 
} 

测试成功,但是当我要与getInstance方法检索实例。我之前设置的所有参数(通过构造函数之前)都是空的。 我是新来的嘲笑的对象,所以这是正常的行为,或者在我的代码中有错误吗?

+0

这似乎与嘲笑有关,因为您不嘲笑有问题的对象。 –

回答

14

它确实取决于GeneralConfigService#getInstance()的实现。如果您使用@InjectMocks注释,您也可以简化您的测试代码。

当使用MockitoJUnitRunner你不需要手动初始化嘲笑和注入你的依赖:

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

    @InjectMocks 
    private GeneralConfigService generalConfigService; 

    @Mock 
    private GeneralConfigDAO generalConfigDAO; 

    @Test 
    public void testAddGeneralConfigCallDAOSuccess() { 
     // generalConfigService is already instantiated and populated with dependencies here 
     ... 
    } 
} 
+0

只是在这里:https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/ –

3

所有方法调用Mockito嘲笑默认返回null。如果你想让它返回其他东西,你需要通过when声明告诉它。

看起来你正在考虑下面的工作......你打电话setInstance,然后期望getInstance返回传递给setInstance的值,因为这是DAO的工作方式。如果这是你所尝试的,那么你不应该通过调用getInstance来测试setInstance,因为getInstance将返回你配置模拟返回的任何内容,并且与传递给setInstance的内容无关。请使用verify来验证DAO的适当方法是从setInstance方法中调用的。

例如,如果GeneralConfigService.setInstance电话GeneralConfigDAO.setInstance那么你的测试应该是这样的......

@Test 
public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException { 
gen = createGeneralConfigs("label", "value"); 

generalConfigService.setInstance(gen); 
generalConfigService.persist(); 

verify(genConfigDAO).setInstance(sameInstance(gen)); 
} 

而且,如果gen是模拟(通过@Mock)你为什么它通过gen = createGeneralConfigs...

分配到别的东西
6

不要忘记使用

MockitoAnnotations.initMocks(this); 

如果你是惩戒OBJE ct通过注释,即@Mock Objectname

+1

initMocks不需要时使用Mockito JUnit亚军。 –

+0

感谢您的评论。无论哪种方式,我相信... –

+0

今天我在主类中使用模拟。是啊〜 – Tiina