Java 在Mockito中模仿我们不能明确指定的东西

Java 在Mockito中模仿我们不能明确指定的东西,java,junit4,mockito,Java,Junit4,Mockito,我有这样一段代码: class Lekcja { Calendar _date; public Lekcja() { _date = Calendar.getInstance(); } public Calendar getDate() { return _date; } } 我想用JUnit4和Mockito来测试它,而不是用真正的Calendar对

我有这样一段代码:

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

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

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

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

和两个实现,real:

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;
    }
    //...
}
另见
    • 您可以使用


      从技术上讲,您可以使用PowerMock进行这种模拟,但您确实应该使用Tomasz answer。不要测试这个类。它没有任何逻辑,因此不存在逻辑错误的可能性,因此对它进行测试没有任何好处。认真地把时间花在不同的事情上。
      class Lekcja {
          Calendar _date;
          public Lekcja(Calendar date) {
              this._date = date;
          }
          //...
      }
      
      @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());
          }
      }