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

时间:2012-01-19 13:15:47

标签: java junit jmockit

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

如果“条目”的“lastContact”属性超过5分钟,则“条目”可以过期。我使用模拟来创建这样的Entry对象:

@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中,并且在“purge()”之后,只保留未过期的条目)。 但是设置模拟会改变整个类,因此该类的所有实例都将被模拟:

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

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

谢谢

1 个答案:

答案 0 :(得分:3)

您可以通过添加mockit.Invocation参数并制作模拟方法reentrant来实现。但是使用Expectations API更简单,您可以在其中声明“@Injectable Entry expiredEntry”模拟字段/参数,该字段/参数不会影响Entry的其他实例。