我不知道它是否应该这样做,但是我想不是。看看下面的代码。
$query=DB::table('clients')
->leftjoin('ecommerce_contacts','ecommerce_contacts.client_id', '=', 'clients.id')
->select('ecommerce_contacts.*', 'clients.*')
->where('clients.is_deleted', '=', '0');
$search_fields=['fname','lname','gender','number','registered_date','purchase'];
foreach($search_fields as $key){
if(!is_null($key)){
$query->orWhere('clients.'.$key, 'LIKE', '"%" . '.$request->$key.' . "%"');
}
}
$client = $query->get();
$data = json_encode($client);
return $data;
我确实希望File mocked = PowerMockito.mock(File.class);
PowerMockito.whenNew(File.class).withParameterTypes(String.class).withArguments(eq(THE_TARGET_PATH)).thenReturn(mocked);
File normalFile = new File(WORKING_PATH);
File mockedFile = new File(THE_TARGET_PATH);
将正常创建,但实际上是normalFile
。 null
被正确地模拟了。
我也在使用mockedFile
和@RunWith(PowerMockRunner.class)
我正在使用:
@PrepareForTest({ClassWhereInstanceIsCreated.class, File.class})
答案 0 :(得分:2)
我的发现表明,没有使用PowerMockito / PowerMockito 2进行部分构造函数模拟的好方法。通过逻辑,您应该能够执行类似的操作
PowerMockito.whenNew(File.class).withParameterTypes(String.class)
.withArguments(eq(WORKING_PATH)).thenCallRealMethod();
但这会在PowerMockito中触发类似于此的内部异常
org.mockito.exceptions.base.MockitoException:无法在Java对象上调用抽象的真实方法!仅在模拟非抽象方法时才可以调用真实方法。 //正确的示例:when(mockOfConcreteClass.nonAbstractMethod())。thenCallRealMethod();
因此,我看到的唯一方法是重新编写测试。在模拟构造函数之前,应首先构造所有必需的File
对象,并提供PowerMockito规则,该规则将在每种情况下返回。
File mocked = Mockito.mock(File.class);
// create file as you want
File realFile = new File(WORKING_PATH);
// tell PowerMockito to return it
PowerMockito.whenNew(File.class).withParameterTypes(String.class)
.withArguments(Mockito.eq(WORKING_PATH)).thenReturn(realFile);
// tell PowerMockito to return mock if other argument passed
PowerMockito.whenNew(File.class).withParameterTypes(String.class)
.withArguments(Mockito.eq(THE_TARGET_PATH)).thenReturn(mocked);
File normalFile = new File(WORKING_PATH);
File mockedFile = new File(THE_TARGET_PATH);
这是不受欢迎的解决方案,但我无法提供更好的解决方案。
希望有帮助!