JUnit如何模拟参数对象的不同值?

时间:2018-09-28 10:12:12

标签: java unit-testing junit mockito

以下是我使用JUnit Mockito的测试代码:

@Before
public void preSetup() throws Exception {   
    AuditTrail auditTrail = new AuditTrail();
    auditTrail.setEventType(1);
    auditTrail.setEventDetail("play");
    auditTrail.setEventDate(new Date());

    Mockito.doReturn(auditTrail).when(auditService).addAuditTrail(auditTrail);
}

@Test
public void testaddPlayAuditRecord() {

    boolean value = auditService.addPlayAuditRecord();
    assertEquals(true, value);
}

我的服务如下:

@Override
public boolean addPlayAuditRecord() {
    return addAuditRecord(1,"play");
}

@Override
public boolean addDeleteAuditRecord() {
    return addAuditRecord(2,"delete");
}

@Override
public boolean addSearchAuditRecord() {
    return addAuditRecord(3,"search");
}


private boolean addAuditRecord(String eventType, String eventDetail) {
    AuditTrail auditTrail = new AuditTrail();
    auditTrail.setEventType(eventType);
    auditTrail.setEventDetail(eventDetail);
    auditTrail.setEventDate(new Date());

    AuditTrail obj = auditService.addAuditTrail(auditTrail);
}

auditService.addAuditTrail(auditTrail)进行数据库调用,我要模拟该数据库调用并返回具有我选择的值的对象。

但是,此auditTrail对象是由依赖于调用它的方法的值构建的。它们取决于调用addAuditRecord方法的方法而有所不同。另外,我们使用new Date()获取当前的date对象。因此,我将在测试中使用的日期与在addAuditRecord中使用的日期会有所不同,因为该日期是当前日期。

因此,在我的测试文件中,如何模拟此addAuditTrail方法?可以在@Before方法中进行这种模拟吗?此处传递的auditTrail对象应与addAuditRecord方法中实际构造的对象匹配。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您尝试过吗?

Mockito.doReturn(auditTrail).when(auditService)
                   .addAuditTrail(ArgumentMatchers.any(AuditTrail.class));

通过这种方式,每次传递AuditTrail对象时,无论其内部值如何,都将运行此规则。

对于您的Mockito版本,只需使用:

Mockito.doReturn(auditTrail).when(auditService)
                   .addAuditTrail(Matchers.any(AuditTrail.class));