2

我有一段这样的代码:

    class Lekcja {
        Calendar _date;
        public Lekcja() {
            _date = Calendar.getInstance();
        }
        public Calendar getDate() {
            return _date;
        }
    }

我想使用 JUnit4 和 Mockito 对其进行测试,而不是使用真正的 Calendar 对象,我想在那里放置一个模拟对象。你能告诉我怎么做吗?

4

2 回答 2

3

模拟值对象很少是一个好主意。你应该模拟行为,而不是数据。我想您真正想要实现的是能够在测试中使用任意日期(这是一个好主意)。

我在这种情况下成功使用的模式是假系统时钟(来自该站点的示例):

public interface TimeSource {
  long currentTimeMillis();
} 

还有两个实现,真实的:

public final class RealSource implements TimeSource {

  public long currentTimeMillis() {
    return System.currentTimeMillis();
  }

}

和假测试:

public final class FakeSource implements TimeSource {

  public long currentTimeMillis() {
    return //...whatever you want
  }

}

我发现currentTimeMillis()在辅助方法中制作 static 并使用static指向 current 的字段很方便TimeSource

最后,更简单的方法是直接传递日期:

class Lekcja {
    Calendar _date;
    public Lekcja(Calendar date) {
        this._date = date;
    }
    //...
}

也可以看看

于 2012-06-01T07:41:16.530 回答
2

你可以使用PowerMock

@RunWith(PowerMockRunner.class)
@PrepareForTest(Calendar.class)
public class LekcjaTest {
    private Lekcja lekcja;
    private Date myDate;

    @Before
    public void setUp() {
        myDate = mock(Date.class);

        PowerMockito.mockStatic(Calendar.class);
        PowerMockito.when(Calendar.getInstance()).thenReturn(myDate);
    }

    @Test
    public void calendarTest() {
        lekcja = new Lekcja();

        //verifies that the static call has been made
        PowerMockito.verifyStatic();
        Calendar.getInstance();

        assertEquals(myDate, lekcja.getDate());
    }
}
于 2012-06-01T08:40:20.090 回答