我们迁移到了mockito-core而不是mockito-all,以便能够使用新的流畅存根功能。我们还有一个test-util-lib,其中包含一个用于存根InitialContext的util。在使用此测试实用程序库的 maven 项目中,我突然得到了UnnecessaryStubbingException
.
这是代码:
public class WildFlyInitialContextFactory implements InitialContextFactory {
private static final Map<String, Object> ENTRIES = new HashMap<>();
private static Context context = initMock();
static {
System.setProperty( "java.naming.factory.initial", WildFlyInitialContextFactory.class.getName() );
}
private static Context initMock() {
Context context = null;
try {
context = mock( Context.class );
when( context.lookup( anyString() ) ).thenAnswer( invocation -> {
if ( ENTRIES.containsKey( invocation.getArguments()[0] ) ) {
return ENTRIES.get( invocation.getArguments()[0] );
}
else {
throw new NamingException( );
}
} );
}
catch (NamingException ex ) {
LOG.error( ex );
}
return context;
}
public static void setEntry(String lookup, Object object) {
ENTRIES.put( lookup, object );
}
@Override public Context getInitialContext(Hashtable<?, ?> arg0) {
return context;
}
}
我也尝试了相反的方法(doAnswer.when construction),结果相同。注意:我只想在 .lookup(字符串参数)上触发。
似乎 Mockito 在运行测试类时会扫描未使用的模拟。这个模拟(作为在测试库中初始化的库模拟)并不总是被调用。解决方案是使用已添加到更高版本的 Mockito 中的Mockito.lenient().when( context )
。