我有以下类:
public class FinanceService {
private BookingDao bookingMasterDao;
private BookingDao bookingDao;
public void createRecords(FinancialSummary financialSummary) {
BookingEntity booking = bookingDao.loadById(1);
//do stuff with this booking object
}
}
我想模拟bookingDao,所以我有下面的单元测试类
public class FinanceServiceTest {
@Mock
private BookingDao bookingDao;
@InjectMocks
private FinanceService financeService = new FinanceService();
@Before
public void before() { MockitoAnnotations.initMocks(this);}
@Test
public void testCreateRecords() {
BookingEntity bookingEntity = new BookingEntity();
FinancialSummary financialSummary = new FinancialSummary();
when(bookingDao.loadById(anyInt())).thenReturn(bookingEntity);
financeService.createRecords(financialSummary);
}
}
这将导致空指针异常,因为bookingMasterDao
被模拟,但bookingDao
没有。如果我在FinanceService中调换这两个位置,它就能工作。Mockito似乎是在模仿第一个匹配该类型的人。
是否有一种方法可以指示Mockito通过给它你想模拟的变量的名称?
From javadoc:
注1:如果你有相同类型的属性(或相同的擦除),最好用匹配的属性命名所有
@Mock
注释字段,否则Mockito可能会混淆,注入不会发生。
所以您必须为mock命名,参见Mock.html#name()
(旁注:因此您不能对两个DAO使用相同的模拟)。
很简单,只需声明两个 mock,一个用于每个目标DAO字段:
public class FinanceServiceTest {
@Mock BookingDao bookingMasterDao;
@Mock BookingDao bookingDao;
...
}