我有以下课程:
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
}
}
我想模拟预订道,所以我有以下junit测试类
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提供你想要模拟的变量的名称来指示Mockito?
答案 0 :(得分:0)
来自javadoc:
注意1:如果您拥有相同类型(或相同的删除)的属性,最好使用匹配的属性命名所有
@Mock
带注释的字段,否则Mockito可能会感到困惑并且注入赢了&# 39; t发生。
所以你必须为你的嘲笑命名,见Mock.html#name()
(旁注:结果你不能对两个DAO使用相同的模拟)。
答案 1 :(得分:0)
简单,只需声明两个模拟,每个目标DAO字段一个:
public class FinanceServiceTest {
@Mock BookingDao bookingMasterDao;
@Mock BookingDao bookingDao;
...
}