我在下面创建了一个自定义Predicate
,并希望使用mockito
对其进行测试。我正在创建特定异常类的模拟,因为这些类没有公共构造函数。运行测试后,Assert失败,因为predicate
返回false
而不是true
。在打印模拟异常的class
时,它具有WebClientResponseException$ServiceUnavailable$MockitoMock$54675
。看起来模拟没有被正确识别。我在这里做错了什么吗?
同品种器械测试
@ExtendsWith(MockitoExtention.class)
class PredicateTest{
@InjectMocks
CustomPredicate customPredicate;
@Test
public void testPredicate(){
final ServiceUnavailable serviceUnavailable = mock(ServiceUnAvailable.class);
assertTrue(customPredicate.test(serviceUnavailable))
}
}
自定义等同
CustomPredicate implements Predicate<Throwable>{
private static final List<Class<?>> Exceptions= Arrays.asList(WebClientResponseException.ServiceUnavailable.class);
private static final Predicate<? super Throwable> ClassToControl= throwable -> Exception.contain(throwable.getClass());
@Override
public boolean test(Throwable t){
return ExceptionUtils.getThrowableList(t).stream().anyMatch(ClassToControl);
}
}
3条答案
按热度按时间eqqqjvef1#
实际上问题出在
mock(ServiceUnAvailable.class)
--当你用这种方法创建一个对象时,它会有一个类ServiceUnAvailable$MockitoMock
,而不是ServiceUnAvailable.class
,这意味着你的下一个检查填充失败:因为
Exceptions
列表不包含元素ServiceUnAvailable$MockitoMock
。为了以这种方式测试异常,我建议进行下一个修复(我稍微修改了代码,但我希望思路清晰):
同品种器械:
试验:
jckbn6z72#
@VolodyaLombrozo正确识别了问题的根本原因:
除了他的回答之外,我还想建议更多更改代码的选项:
让我们重构自定义 predicate :
修复测试
您有两个选项,具体取决于您是否希望 predicate 传递子类:
所有这些都假设这是伪代码,并且你的Exceptions列表比较长。如果你想用一个类来测试你的throwable,lambda就足够了:
更新:模拟内联
如果使用mockito-inline,则会更改构造模拟的方式:
这个替代的mock maker使用Java工具API和子类化的组合,而不是创建一个新的类来表示mock。
InlineByteBuddyMockMaker的javadoc说:
这个mock maker在创建mock时会尽量避免创建子类,否则会使用
org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker
来创建mock类,这意味着下面的条件成立除非满足以下条件中的任何一个,否则在这种情况下,模型制作者退回到子类的创建。
因此,如果您使用mockito-inline,测试将通过,因为没有创建子类:
tyg4sfes3#
所以问题是我没有mockito内联jar在pom中。不知道为什么,但这解决了问题