org.powermock.api.mockito.ClassNotPreparedException в статическом насмешке над классом - PullRequest
0 голосов
/ 15 мая 2019

Я пишу модульный тест для макетирования статического метода в тексте, но всегда получаю ClassNotPreparedException.Я думаю, что это возможно только в том случае, если только класс является статическим, но у меня есть нестатический класс.Чего мне не хватает?

Я пробовал различные решения, такие как использование @rule или @ PowerMockIgnore

//myVerticleTest.java

package com.blabla.me.verticles;
import static com.google.common.truth.Truth.assertThat;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import io.vertx.core.Vertx;
import io.vertx.junit5.VertxTestContext;
import io.vulpx.VulpxTestBase;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.junit.runner.RunWith;
import com.blabla.me.verticles.AdditionalInformationCardVerticle;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.junit.Rule;
import com.blabla.me.verticles.st;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ st.class })
@PowerMockIgnore({"org.mockito.*"})
public class myVerticleTest extends VulpxTestBase {
@Rule public PowerMockRule rule = new PowerMockRule();
private Vertx vertx;
private AdditionalInformationCardVerticle dummy;

    @BeforeEach
    @PrepareForTest({ st.class })
    public void setUp(VertxTestContext testContext) throws Exception {
        vertx = Vertx.vertx();
        try {
            PowerMockito.mockStatic(st.class);
            PowerMockito.when(st.createClient()).thenReturn("kk");
         //deploying verticle
            dummy = new AdditionalInformationCardVerticle();
            vertx.deployVerticle(dummy, testContext.completing());
        } catch (Exception e) {
            System.out.println("heyyy eroorrr : " + e);
        }
    }
    @Test
    @PrepareForTest({ st.class })
    public void justnormaltest() {
        cla ownclass = new cla();
        String k = ownclass.createfromclass();
        assertThat("kk").isEqualTo(k);
    }
}
// st.java 
public class st {
    public static String createClient() {
        return "kk";
    }
}
// cla.java
public class cla {
    public String createfromclass() {
        return st.createClient();
    }
}

Я ожидаю, что оно выполнит утверждение, но я всегда получаю нижеexcpetion: "org.powermock.api.mockito.ClassNotPreparedException: класс com.sap.me.verticles.st не подготовлен к тесту. Чтобы подготовить этот класс, добавьте класс в аннотацию @PrepareForTest. Если вы этого не сделаетеЧтобы использовать эту аннотацию, добавьте аннотацию на уровне класса или метода. "

1 Ответ

1 голос
/ 15 мая 2019

Здесь:

@PrepareForTest({ st.class })

Тот, кто идет в ровно одно место: перед вашим тестовым классом public class myVerticleTest.

И подсказка: вместо добавлениявсе больше и больше «вещей» к неработающему коду: выбирайте любую хорошую документацию и старайтесь следовать этому до конца;в примере кода (вместо того, чтобы предположить, что добавление большего или большего количества вещей здесь или там поможет).

Одна хорошая отправная точка: официальная документация по статическому моделированию.

И, конечно, обычное предостережение: во-первых, не стоит изучать PowerMock.Вместо этого сосредоточьтесь на написании «легко тестируемого» кода.Слишком часто люди думают, что PowerMock (ito) является решением их проблемы.Когда в действительности их проблема заключается в неспособности написать «простой в тестировании» производственный код.

...