2015-02-05 37 views
1

我有一个简单的单元测试,在我测试一个DAO。我嘲笑依赖并通过构造函数将它注入主题。 我需要拆除吗? Mockito测试是否以与进入设置方法相同的状态退出?请也解释一下。在Mockito中嘲笑时,我需要一个拆卸方法吗?

@Mock 
private PersonDAO dao; 

@Overide 
public void setup(){ 
    MockitoAnnotations.initMocks(this); 
    sut = new PersonResource(dao); 
} 

@Test 
public void testUpdate(){ 
    when(dao.findNameById(1)).thenReturn("Abhinav-before"); 
    sut.update(1, "Abhinav-after"); 
} 
+1

请问您可以显示代码吗?它会简化很多事情 – DixonD 2015-02-05 17:52:53

+0

<! - language:lang-java - > ' @Mock private personDAO dao; @Overide public void setup(){ MockitoAnnotations.initMocks(this); sut =新的PersonResource(dao); } @Test public void testUpdate(){(dao.findNameById(1)).reReturn(“Abhinav-before”); sut.update(1,“Abhinav-after”); }' 我是否需要拆散为道模拟? – 2015-02-05 19:07:13

+0

@AbhinavGandhi请勿在评论中发布相关代码。请编辑你的问题,并包括你提供的代码 – Barranka 2015-02-05 19:14:42

回答

2

除非你在其他国家推动的资源,诸如高速缓存或临时文件拉动,不需要拆掉嘲讽时的任何资源。

模拟对象只是一个对象;它不具有或维护任何外部服务。它会像您在测试中使用的任何其他对象一样收集垃圾。依赖于你如何注入模拟,无论如何它都会在每次测试中重新创建。

现在,您提供的代码一点点,有你使用的@Before注释,你会确信,无论是模拟被之前注入试运行的每个实例。就目前而言,该测试可能不会编译;我无法想象这样一种情况,即您将通过该测试扩展另一种具有setup方法的测试。

(如果你做什么,请不要。你只会伤害自己。)

最后,断言在本次测试的东西。你没有断言任何东西,所以它会一直通过,除非你断言你的测试对象的状态是真实的。

与该位的方式进行,如果使用MockitoJUnitRunner相反,你不需要initMocks一块,但如果这是你的唯一亚军作为JUnit的不支持多个亚军,这是只适用。

@RunWith(MockitoJUnitRunner.class) 
public class PersonResourceTest { 
    @Mock 
    private PersonDAO dao; 

    @InjectMocks 
    private PersonResource testObject; 

    @Test 
    public void testUpdate(){ 
     when(dao.findNameById(1)).thenReturn("Abhinav-before"); 
     testObject.update(1, "Abhinav-after"); 
    } 
} 
+0

当你说 - 它是为每个测试重新创建的,模拟器在测试套件的最后一次测试中被破坏了吗? – 2015-02-05 18:13:20

+0

模拟 - 连同你实例化的任何其他对象 - 在完成每个单独的测试后被销毁。然后,他们在下一次测试开始时重新创建。至少,我从我的经历和与它的互动中看到了这一点。 – Makoto 2015-02-05 18:14:13

+0

请注意,对于JUnit而言,这可能是正确的,因为此框架为每个测试方法创建了一个新实例。然而,TestNG的想法是不同的,并且创建了一个单一的测试实例,并且一个模拟包含调用,存根等等,因此在这种情况下是肯定的,必须有一个'@ AfterMethod'拆卸方法''Mockito.reset (mock1,mock2,...)' – Brice 2015-02-07 10:52:41