Java 当存在两个相同类型的变量时模拟变量
我有以下课程:Java 当存在两个相同类型的变量时模拟变量,java,unit-testing,junit,mockito,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
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,所以我有以下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?来自:
注1:如果您有相同类型(或相同擦除)的属性,最好使用匹配的属性命名所有@Mock
注释字段,否则Mockito可能会混淆,不会发生注入
所以你必须给你的模拟命名,明白吗
(旁注:因此不能对两个DAO使用相同的模拟)。来自:
注1:如果您有相同类型(或相同擦除)的属性,最好使用匹配的属性命名所有@Mock
注释字段,否则Mockito可能会混淆,不会发生注入
所以你必须给你的模拟命名,明白吗
(旁注:因此不能对两个DAO使用相同的模拟)。简单,只需声明两个模拟,每个目标DAO字段一个:
public class FinanceServiceTest {
@Mock BookingDao bookingMasterDao;
@Mock BookingDao bookingDao;
...
}
简单,只需声明两个模拟,每个目标DAO字段一个:
public class FinanceServiceTest {
@Mock BookingDao bookingMasterDao;
@Mock BookingDao bookingDao;
...
}
用手动注入替换@InjectMock应该绕过这个问题我同意RC也有感觉!Lol当你说手动注入时,你的意思是将mock作为FinanceService构造函数的一部分进行传递吗?我刚刚测试了你的代码,它在我身边工作。你使用哪个版本的mockito?用手动注入替换@injectmock应该绕过这个问题我同意RC也有感觉!Lol当你说手动注入时,你的意思是作为FinanceService构造函数的一部分传递模拟吗?我刚刚测试了你的代码,它在我这边工作。你使用哪个版本的mockito?我试过了,但没有工作。这对我来说没有任何区别。“不起作用”有点宽泛,也许你可以提供你试过的代码(在你的问题中)我试过了,但不起作用。这对我来说没有任何区别。“不起作用”有点宽泛,也许你可以提供你尝试过的代码(在你的问题中)这确实起作用,这就是我使用的工作。声明一个我从未使用过的变量似乎有点奇怪。是的,但肯定在
FinanceService
中有一个方法使用了bookingMasterDao
。因此,您可以在FinanceServiceTest
中添加一个测试,该测试将使用第二个模拟。这确实有效,也是我使用的解决方案。声明一个我从未使用过的变量似乎有点奇怪。是的,但肯定在FinanceService
中有一个方法使用了bookingMasterDao
。因此,您可以向FinanceServiceTest
添加一个测试,该测试将使用第二个模拟。