Java.lang.NoSuchMethodError: нет статического метода clearInstance ()

Я пытаюсь запустить тест в Android Studio, тестовая установка выдает java.lang.NoSuchMethodError

Контрольная работа:

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MusicLocalDataSourceTest {
    private Context context;
    private final static String TITLE_1 = "TITLE 1";
    private final static String ID_1 = "1";
    private final static String ARTISTIC_1 = "ARTISTIC 1";


    private DataSource<Music> mMusicDataSource;
    private StapeDatabase mDatabase;

    @Before
    public void setup() {
        context = InstrumentationRegistry.getTargetContext();
        mDatabase = Room
                .inMemoryDatabaseBuilder(context, StapeDatabase.class)
                .build();

        IEMusicDao dao = mDatabase.musicDao();

        MusicLocalDataSource.clearInstance(); // throws error
        mMusicDataSource = MusicLocalDataSource.getInstance(new SingleExecutor(), dao);
    }

    @After
    public void cleanUp() {
        mDatabase.close();
        MusicLocalDataSource.clearInstance();
    }

    @Test
    public void should_not_have_null_instance() {
        assertNotNull(mMusicDataSource);
    }
}

classe que estou testando:
class being tested:

public class MusicLocalDataSource implements IEMusicDataSource<Music> {
    private static volatile MusicLocalDataSource INSTANCE;
    private IEMusicDao musicDao;
    private AppExecutors appExecutors;

    private MusicLocalDataSource(@NonNull AppExecutors appExecutors, @NonNull IEMusicDao musicDao) {
        this.appExecutors = appExecutors;
        this.musicDao = musicDao;
    }

    public static MusicLocalDataSource getInstance(@NonNull AppExecutors appExecutors, @NonNull
                                                   IEMusicDao musicDao) {

        if (INSTANCE ==  null) {
            synchronized (MusicLocalDataSource.class) {
                if (INSTANCE == null) {
                    INSTANCE = new MusicLocalDataSource(appExecutors, musicDao);
                }
            }
        }

        return INSTANCE;
    }

    @Override
    public void findAll(@NonNull LoadDataCallback<Music> callback) {
        Runnable runnable = () -> {
          final List<Music> musics = musicDao.findAll();
          this.appExecutors.mainThread().execute(() -> {
              if (musics.isEmpty()) {
                  callback.onDataNotAvailable();
              } else {
                  callback.onDataLoaded(musics);
              }
          });
        };

        appExecutors.diskIO().execute(runnable);
    }

    @Override
    public void findById(@NonNull String dataId, @NonNull GetDataCallback<Music> callback) {
        Runnable runnable = () -> {
            final Music music = musicDao.findMusicById(dataId);

            appExecutors.mainThread().execute(() -> {
                if (music != null) {
                    callback.onDataLoaded(music);
                } else {
                    callback.onDataNotAvailable();
                }
            });
        };

        appExecutors.diskIO().execute(runnable);
    }

    @Override
    public void save(@NonNull Music data) {

    }

    @Override
    public void update(@NonNull Music data) {

    }

    @Override
    public void delete(@NonNull Music data) {

    }

    @Override
    public void delete(@NonNull String dataId) {

    }

    @Override
    public void deleteAll() {

    }

    @VisibleForTesting
    static void clearInstance() {
        INSTANCE = null;
    }

след:

   java.lang.NoSuchMethodError: No static method clearInstance()V in class

Lcom/stapeapp/stape/music/domain/datasource/MusicLocalDataSource; or its super classes (declaration of 'com.stapeapp.stape.music.domain.datasource.MusicLocalDataSource' appears in /data/app/com.stapeapp.stape.mock-2/base.apk) at com.stapeapp.stape.music.domain.datasource.MusicLocalDataSourceTest.cleanUp(MusicLocalDataSourceTest.java:56) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at android.support.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:80) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runners.Suite.runChild(Suite.java:128) at org.junit.runners.Suite.runChild(Suite.java:27) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at org.junit.runner.JUnitCore.run(JUnitCore.java:115) at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58) at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1871)

кто-то знает, что происходит, и / или может подсказать мне дорогу?

Редактировать: эта ошибка возникла снова, когда я создал новый экземпляр объекта в другом тесте, этот объект является статическим атрибутом в тесте.

public class IEMusicDaoTest {
    private static final Music MUSIC = new Music("1", "title", "artistic"); // error occurred here
    private StapeDatabase mDatabase;

    @Before
    public void setUp() throws Exception {
        Context context = InstrumentationRegistry.getContext();
        mDatabase = Room.inMemoryDatabaseBuilder(context, StapeDatabase.class).build();
    }

    @After
    public void tearDown() throws Exception {
        mDatabase.close();
    }

    @Test
    public void should_have_success_in_save_music() {
        mDatabase.musicDao().save(MUSIC);

        Music loaded = mDatabase.musicDao().findMusicById(MUSIC.getId());

        assertMusic(loaded, MUSIC.getId(), MUSIC.getName(), MUSIC.getArtist());

    }

    private void assertMusic(Music loaded, String id, String name, String artist) {
        Assert.assertThat(loaded, CoreMatchers.notNullValue());
        Assert.assertThat(loaded.getId(), CoreMatchers.is(id));
        Assert.assertThat(loaded.getName(), CoreMatchers.is(name));
        Assert.assertThat(loaded.getArtist(), CoreMatchers.is(artist));
    }

должен быть публичным

Chisko 11.04.2018 18:44

вы вызываете метод класса MusicLocalDataSource без его предварительного создания, метод clearInstance () не является статическим и может быть вызван только для экземпляра класса.

Alok Sinha 11.04.2018 18:46

Возможный дубликат Как отладить исключение NoSuchMethodError?

Jacob B. 11.04.2018 18:47

@AlokSinha в коде видно, что метод статический. Однако похоже, что аннотация VisibleForTesting не работает должным образом.

Amit Bera 11.04.2018 18:48

та же общественная ошибка сохраняется. Нет, этот метод статический.

Marcus Vinicius 11.04.2018 18:50

@AmitBera Я так думаю, но не могу подтвердить.

Marcus Vinicius 11.04.2018 18:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
789
1

Ответы 1

Обычно проверяйте версия, в котором был представлен метод этого класса. Если метод был представлен в более новой версии, компилятор примет, но это будет ошибкой в ​​время выполнения при работе на более старой платформе!

Другие вопросы по теме