在Mockito中嘲笑我们无法明确分配的东西



我有一段这样的代码:

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

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

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

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

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()静态并使用指向当前TimeSource static字段很方便。

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

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

参见

  • 在 Java 中对基于时间的逻辑进行单元测试
你可以

使用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());
    }
}

相关内容

  • 没有找到相关文章

最新更新