Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当存在两个相同类型的变量时模拟变量_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

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
添加一个测试,该测试将使用第二个模拟。