如果不匹配,Powermockito whenNew返回null

时间:2018-12-12 11:09:32

标签: java testing mockito powermock

我不知道它是否应该这样做,但是我想不是。看看下面的代码。

$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); 将正常创建,但实际上是normalFilenull被正确地模拟了。

我也在使用mockedFile@RunWith(PowerMockRunner.class)

我正在使用:

@PrepareForTest({ClassWhereInstanceIsCreated.class, File.class})

1 个答案:

答案 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);

这是不受欢迎的解决方案,但我无法提供更好的解决方案。

希望有帮助!