当存在两个相同类型

时间:2016-10-21 16:24:37

标签: java unit-testing junit mockito

我有以下课程:

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?

2 个答案:

答案 0 :(得分:0)

来自javadoc

  

注意1:如果您拥有相同类型(或相同的删除)的属性,最好使用匹配的属性命名所有@Mock带注释的字段,否则Mockito可能会感到困惑并且注入赢了&# 39; t发生。

所以你必须为你的嘲笑命名,见Mock.html#name()

(旁注:结果你不能对两个DAO使用相同的模拟)。

答案 1 :(得分:0)

简单,只需声明两个模拟,每个目标DAO字段一个:

public class FinanceServiceTest {
    @Mock BookingDao bookingMasterDao;
    @Mock BookingDao bookingDao;

    ...
}