Niedawno podczas scalania nowych testów jednostkowych do mojej gałęzi roboczej zacząłem widzieć ten błąd:

Exception (java.lang.NoSuchMethodError) encountered during startup: com.google.common.util.concurrent.MoreExecutors.newDirectExecutorService()Lcom/google/common/util/concurrent/ListeningExecutorService;
java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.newDirectExecutorService()Lcom/google/common/util/concurrent/ListeningExecutorService;
    at org.apache.cassandra.index.SecondaryIndexManager.<clinit>(SecondaryIndexManager.java:125)
    at org.apache.cassandra.db.ColumnFamilyStore.<init>(ColumnFamilyStore.java:405)
    at org.apache.cassandra.db.ColumnFamilyStore.createColumnFamilyStore(ColumnFamilyStore.java:623)
    at org.apache.cassandra.db.ColumnFamilyStore.createColumnFamilyStore(ColumnFamilyStore.java:597)
    at org.apache.cassandra.db.ColumnFamilyStore.createColumnFamilyStore(ColumnFamilyStore.java:588)
    at org.apache.cassandra.db.Keyspace.initCf(Keyspace.java:417)
    at org.apache.cassandra.db.Keyspace.<init>(Keyspace.java:324)
    at org.apache.cassandra.db.Keyspace.open(Keyspace.java:129)
    at org.apache.cassandra.db.Keyspace.open(Keyspace.java:106)
    at org.apache.cassandra.db.SystemKeyspace.checkHealth(SystemKeyspace.java:935)
    at org.apache.cassandra.service.StartupChecks$10.execute(StartupChecks.java:422)
    at org.apache.cassandra.service.StartupChecks.verify(StartupChecks.java:125)
    at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:200)
    at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:602)
    at org.cassandraunit.utils.EmbeddedCassandraServerHelper.lambda$startEmbeddedCassandra$1(EmbeddedCassandraServerHelper.java:150)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Oto obraźliwa klasa testowa:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { MyApplication.class })
@TestExecutionListeners(listeners = { CassandraUnitDependencyInjectionTestExecutionListener.class, DependencyInjectionTestExecutionListener.class })
@EmbeddedCassandra(timeout = 100000)
@CassandraDataSet("indexer.cql")
@ActiveProfiles("test")
public class MyDaoTest {

    @Autowired
    MyDao myDao;


    @Test ...
}

Udało mi się sprawdzić, czy testy jednostkowe przebiegają zgodnie z zapisem, uruchamiając mvn test -DskipMutation, więc wydaje się, że jest to problem podczas używania wbudowanej Cassandry w połączeniu z testami mutacji, ale nie jestem zbyt zaznajomiony z żadną z tych technologii.

Czy ktoś kiedykolwiek napotkał ten problem i czy mógłbyś podać kilka wskazówek dotyczących rozwiązania tego problemu (bez wyłączania testów mutacji)?

0
p.s.w.g 19 grudzień 2019, 19:05

1 odpowiedź

Najbardziej prawdopodobną przyczyną tego błędu jest to, że masz wersję Guava poniżej 18.0, gdzie MoreExecutors.newDirectExecutor - jest wymagana dla Cassandry. Uruchom mvn dependency:tree w swoim projekcie i sprawdź wersje Guava, które masz w swoim projekcie. Jeśli którakolwiek z zależności jest zależna od starszej wersji Guavy, spróbuj wykluczyć Guawę z tej zależności (chociaż może to zepsuć twój kod - w tym przypadku spróbuj znaleźć zależność, która nie używa tej starej wersji Guawy).

0
Alex Ott 26 grudzień 2019, 17:42
Dzięki za odpowiedź, ale niestety nie wydaje mi się, żeby to było to. mvn dependency:tree -Dincludes=com.google.guava zwraca tylko jedną zależność, \- com.google.guava:guava:jar:18.0:compile.
 – 
p.s.w.g
26 grudzień 2019, 20:10
To może nie jest uwzględniony w ścieżce testowej? Bo to naprawdę dziwne widzieć NoSuchMethod wtedy
 – 
Alex Ott
26 grudzień 2019, 20:15