2012-01-19 37 views
2

如何在一个测试方法中创建单个类的模拟和非模拟实例?如何在一种测试方法中创建单个类的模拟和非模拟实例?

如果“条目”的“lastContact”属性早于5分钟,则可以过期。我使用模拟创建这样一个入门对象:

@Test 
public void entryOlderThanFiveMinutesIsExpired() { 

    new MockUp<Entry>() { 
     @Mock 
     public Date getLastContact() { 
      return new Date(10000L); // date in the past 
     } 
    }; 
    Entry expiredEntry = new Entry(); 
    assertThat(expiredEntry.isExpired(), is(true)); 
} 

这工作正常。 在下一个测试中,我需要一个“过期”和一个非“过期”条目(都将被添加到一个EntryList中,并且在“清除()”之后只有未过期的条目应该保留)。 但设立嘲笑改变了全班同学,让类的所有实例都将被嘲笑:

@Test 
public void test() { 

    Entry unexpiredEntry = new Entry(); // this should not be mocked 

    new MockUp<Entry>() { 
     @Mock(invocations = 1) 
     public Date getLastContact() { 
      return new Date(10000L); // date in the past 
     } 
    }; 
    Entry expiredEntry = new Entry(); 
    assertThat(expiredEntry.isExpired(), is(true)); 
    assertThat(unexpiredEntry.isExpired(), is(false)); 
} 

这种失败。我尝试了几种设置模拟的方法,但我没有得到它。 我该如何解决这个问题?

谢谢

回答

3

你可以做到这一点通过添加mockit.Invocation参数,使模拟方法reentrant。但Expectations API更简单,您可以声明一个“@Injectable Entry expiredEntry”模拟字段/参数,该参数不会影响Entry的其他实例。