Почему Питест бросает noSuchMethod-ошибку?

#java #maven #pitest

Вопрос:

Поэтому я недавно обновил одно из своих репозиториев до Java 11 и обновил версии некоторых других зависимостей. После прохождения нескольких зависимостей и устранения всех ошибок я, наконец, заставил приложение пройти все модульные и интеграционные тесты, и оно снова работало нормально. Однако, когда я запускаю проект, он также автоматически выполняет тесты на мутации через Pitest.

Это делается в полностью чистой среде: контейнер docker оснащен необходимыми версиями Java и Maven (Java 11 и Maven 3.6.3).

Тесты на мутации теперь не компилируются, и дается следующая трассировка стека:

 18-Aug-2021 15:57:19    [WARNING] Error injecting: org.pitest.maven.PitMojo
18-Aug-2021 15:57:19    com.google.inject.ProvisionException: Unable to provision, see the following errors:
18-Aug-2021 15:57:19    
18-Aug-2021 15:57:19    1) Error injecting constructor, java.lang.NoSuchMethodError: 'void org.pitest.functional.FCollection.mapTo(java.lang.Iterable, java.util.function.Function, java.util.Collection)'
18-Aug-2021 15:57:19      at org.pitest.maven.PitMojo.<init>(Unknown Source)
18-Aug-2021 15:57:19      while locating org.pitest.maven.PitMojo
18-Aug-2021 15:57:19    
18-Aug-2021 15:57:19    1 error
18-Aug-2021 15:57:19        at com.google.inject.internal.InternalProvisionException.toProvisionException (InternalProvisionException.java:226)
18-Aug-2021 15:57:19        at com.google.inject.internal.InjectorImpl$1.get (InjectorImpl.java:1053)
18-Aug-2021 15:57:19        at com.google.inject.internal.InjectorImpl.getInstance (InjectorImpl.java:1086)
18-Aug-2021 15:57:19        at org.eclipse.sisu.space.AbstractDeferredClass.get (AbstractDeferredClass.java:48)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProviderInternalFactory.provision (ProviderInternalFactory.java:85)
18-Aug-2021 15:57:19        at com.google.inject.internal.InternalFactoryToInitializableAdapter.provision (InternalFactoryToInitializableAdapter.java:57)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProviderInternalFactory$1.call (ProviderInternalFactory.java:66)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision (ProvisionListenerStackCallback.java:112)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision (ProvisionListenerStackCallback.java:127)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProvisionListenerStackCallback.provision (ProvisionListenerStackCallback.java:66)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProviderInternalFactory.circularGet (ProviderInternalFactory.java:61)
18-Aug-2021 15:57:19        at com.google.inject.internal.InternalFactoryToInitializableAdapter.get (InternalFactoryToInitializableAdapter.java:47)
18-Aug-2021 15:57:19        at com.google.inject.internal.InjectorImpl$1.get (InjectorImpl.java:1050)
18-Aug-2021 15:57:19        at org.eclipse.sisu.inject.Guice4$1.get (Guice4.java:162)
18-Aug-2021 15:57:19        at org.eclipse.sisu.inject.LazyBeanEntry.getValue (LazyBeanEntry.java:81)
18-Aug-2021 15:57:19        at org.eclipse.sisu.plexus.LazyPlexusBean.getValue (LazyPlexusBean.java:51)
18-Aug-2021 15:57:19        at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:263)
18-Aug-2021 15:57:19        at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:255)
18-Aug-2021 15:57:19        at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo (DefaultMavenPluginManager.java:520)
18-Aug-2021 15:57:19        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:124)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
18-Aug-2021 15:57:19        at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
18-Aug-2021 15:57:19        at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
18-Aug-2021 15:57:19        at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
18-Aug-2021 15:57:19        at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
18-Aug-2021 15:57:19        at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
18-Aug-2021 15:57:19        at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
18-Aug-2021 15:57:19        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
18-Aug-2021 15:57:19        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
18-Aug-2021 15:57:19        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
18-Aug-2021 15:57:19        at java.lang.reflect.Method.invoke (Method.java:566)
18-Aug-2021 15:57:19        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
18-Aug-2021 15:57:19        at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
18-Aug-2021 15:57:19        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
18-Aug-2021 15:57:19        at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
18-Aug-2021 15:57:19    Caused by: java.lang.NoSuchMethodError: 'void org.pitest.functional.FCollection.mapTo(java.lang.Iterable, java.util.function.Function, java.util.Collection)'
18-Aug-2021 15:57:19        at org.pitest.maven.DependencyFilter.<init> (DependencyFilter.java:42)
18-Aug-2021 15:57:19        at org.pitest.maven.AbstractPitMojo.<init> (AbstractPitMojo.java:365)
18-Aug-2021 15:57:19        at org.pitest.maven.PitMojo.<init> (PitMojo.java:14)
18-Aug-2021 15:57:19        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method)
18-Aug-2021 15:57:19        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62)
18-Aug-2021 15:57:19        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45)
18-Aug-2021 15:57:19        at java.lang.reflect.Constructor.newInstance (Constructor.java:490)
18-Aug-2021 15:57:19        at com.google.inject.internal.DefaultConstructionProxyFactory$ReflectiveProxy.newInstance (DefaultConstructionProxyFactory.java:126)
18-Aug-2021 15:57:19        at com.google.inject.internal.ConstructorInjector.provision (ConstructorInjector.java:114)
18-Aug-2021 15:57:19        at com.google.inject.internal.ConstructorInjector.access$000 (ConstructorInjector.java:32)
18-Aug-2021 15:57:19        at com.google.inject.internal.ConstructorInjector$1.call (ConstructorInjector.java:98)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision (ProvisionListenerStackCallback.java:112)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision (ProvisionListenerStackCallback.java:127)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProvisionListenerStackCallback.provision (ProvisionListenerStackCallback.java:66)
18-Aug-2021 15:57:19        at com.google.inject.internal.ConstructorInjector.construct (ConstructorInjector.java:93)
18-Aug-2021 15:57:19        at com.google.inject.internal.ConstructorBindingImpl$Factory.get (ConstructorBindingImpl.java:306)
18-Aug-2021 15:57:19        at com.google.inject.internal.InjectorImpl$1.get (InjectorImpl.java:1050)
18-Aug-2021 15:57:19        at com.google.inject.internal.InjectorImpl.getInstance (InjectorImpl.java:1086)
18-Aug-2021 15:57:19        at org.eclipse.sisu.space.AbstractDeferredClass.get (AbstractDeferredClass.java:48)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProviderInternalFactory.provision (ProviderInternalFactory.java:85)
18-Aug-2021 15:57:19        at com.google.inject.internal.InternalFactoryToInitializableAdapter.provision (InternalFactoryToInitializableAdapter.java:57)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProviderInternalFactory$1.call (ProviderInternalFactory.java:66)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision (ProvisionListenerStackCallback.java:112)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision (ProvisionListenerStackCallback.java:127)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProvisionListenerStackCallback.provision (ProvisionListenerStackCallback.java:66)
18-Aug-2021 15:57:19        at com.google.inject.internal.ProviderInternalFactory.circularGet (ProviderInternalFactory.java:61)
18-Aug-2021 15:57:19        at com.google.inject.internal.InternalFactoryToInitializableAdapter.get (InternalFactoryToInitializableAdapter.java:47)
18-Aug-2021 15:57:19        at com.google.inject.internal.InjectorImpl$1.get (InjectorImpl.java:1050)
18-Aug-2021 15:57:19        at org.eclipse.sisu.inject.Guice4$1.get (Guice4.java:162)
18-Aug-2021 15:57:19        at org.eclipse.sisu.inject.LazyBeanEntry.getValue (LazyBeanEntry.java:81)
18-Aug-2021 15:57:19        at org.eclipse.sisu.plexus.LazyPlexusBean.getValue (LazyPlexusBean.java:51)
18-Aug-2021 15:57:19        at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:263)
18-Aug-2021 15:57:19        at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:255)
18-Aug-2021 15:57:19        at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo (DefaultMavenPluginManager.java:520)
18-Aug-2021 15:57:19        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:124)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
18-Aug-2021 15:57:19        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
18-Aug-2021 15:57:19        at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
18-Aug-2021 15:57:19        at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
18-Aug-2021 15:57:19        at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
18-Aug-2021 15:57:19        at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
18-Aug-2021 15:57:19        at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
18-Aug-2021 15:57:19        at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
18-Aug-2021 15:57:19        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
18-Aug-2021 15:57:19        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
18-Aug-2021 15:57:19        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
18-Aug-2021 15:57:19        at java.lang.reflect.Method.invoke (Method.java:566)
18-Aug-2021 15:57:19        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
18-Aug-2021 15:57:19        at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
18-Aug-2021 15:57:19        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
18-Aug-2021 15:57:19        at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
 

Это только часть трассировки стека, но я считаю, что это важная часть, я могу захватить больше трассировки стека, если это необходимо/запрошено.

Я не смог найти много информации по этому вопросу. Любые похожие темы/сообщения, которые я нашел на StackOverflow/GitHub, просто предлагают либо выполнить mvn clean , либо обновить до более новой версии (наиболее распространенным, как я заметил, является Pitest 1.4.3). Однако, как я уже сказал, тесты на мутации (фактически все тесты) выполняются в совершенно новой и чистой среде, и мы обновили Pitest с 1.1.11 до 1.5.2.

На самом деле, я изначально собирался оставить Pitest в версии 1.1.11, но IllegalArgumentException вместо этого получил ответ и предположил, что это просто потому, что его нужно было обновить.

Почему возникает это исключение? В Pitest отсутствует зависимость, которую мне нужно добавить? Где я могу найти дополнительную информацию о подобных ошибках и какую отладку я мог бы выполнить, чтобы найти причину и сформировать решение?

Спасибо

Комментарии:

1. Можете ли вы опубликовать pom, а также подтвердить, работает ли он/не работает, если вы запустите его на своем компьютере без докера и т.д.

2. Сомневаюсь, что это уместно, но почему pitest 1.5.2, а не 1.6.9?

3. @генри Использует 1.5.2, потому что это самая последняя версия, доступная моей компании. Я опубликую очищенную версию pom позже сегодня. Похоже, он может работать локально, так что это может быть проблемой с контейнером docker. Одно отличие заключается в том, что на моей локальной машине есть Java 11.0.10, а контейнер docker использует 11.0.12, но я нахожу маловероятным, что проблема в этом.

4. В журнале ошибок также указано Unable to load the mojo 'mutationCoverage' in the plugin 'org.pitest:pitest-maven:1.5.2' due to an API incompatibility: org.codehaus.plexus.component.repository.exception.ComponentLookupException: 'void org.pitest.functional.FCollection.mapTo(java.lang.Iterable, java.util.function.Function, java.util.Collection)'

Ответ №1:

Оказывается, наша удаленная среда выполняла тесты немного по-другому и использовала плагин для pitest, который явно не был определен в нашем POM. Плагин был плагином Алекса Виктора «Питест-огурец«, который включает матрицу совместимости, которую я смог использовать для решения проблемы.