Пересмешка в Intellij не игнорирует ошибки компиляции в проверяемом классе? - PullRequest
0 голосов
/ 25 февраля 2020

В настоящее время я выполняю небольшой проект в качестве упражнения для курса тестирования Java, и мы пытались понять, как работает издевательство.

Цель состояла в том, чтобы увидеть, что мы можем игнорировать ошибки в класс, над которым мы издеваемся.

Вот три класса, используемые для этого упражнения:

Collaborateur:

package fr.orsys.tp2junit.prestation;

public class Collaborateur {

        public Collaborateur() {
        }

        public String transformString(String input){
            //Methode avec des bugs
            System.out.println("ok")
            return "ok";
        }
    }

Prestation:

package fr.orsys.tp2junit.prestation;

public class Prestation {

    private Collaborateur collaborateur;

    public Prestation(Collaborateur collaborateur){
        this.collaborateur = collaborateur;
    }

    public String performService(String input){
        return collaborateur.transformString(input);
    }


}

И, наконец, наш тестовый класс - TestPrestation:

package tp2junit;

import fr.orsys.tp2junit.prestation.Collaborateur;
import fr.orsys.tp2junit.prestation.Prestation;
import org.junit.*;
import static org.junit.Assert.*;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class TestPrestation {

    private Prestation prestation;
    private Collaborateur collaborateur;

    @Before
    public void beforeEachTest(){
        collaborateur = mock(Collaborateur.class);
        prestation = new Prestation(collaborateur);
    }

    @Test
    public void testPerformService(){
        when(collaborateur.transformString("Input")).thenReturn("Ok");
        assertEquals("Ok", prestation.performService("Input"));
    }

}

Как вы можете видеть в Collaborateur, отсутствует ';' после System.out и целью упражнения было показать, что издевательство над классом позволит нам игнорировать эту ошибку. Некоторые из моих коллег, которые работают с Eclipse, не сталкивались с проблемой при использовании функции «Запуск от имени JUnit».

В Intellij, однако я не нашел такой опции, я попытался изменить конфигурацию для опции «Перед запуском» из «Построить» в «Построить без проверок ошибок», как предлагали некоторые посты StackOverflow, но при этом я получаю следующую ошибку:

java.lang.NoClassDefFoundError: Lfr/orsys/tp2junit/prestation/Collaborateur;

    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
    at java.lang.Class.getDeclaredFields(Class.java:1916)
    at org.junit.runners.model.TestClass.getSortedDeclaredFields(TestClass.java:77)
    at org.junit.runners.model.TestClass.scanAnnotatedMembers(TestClass.java:70)
    at org.junit.runners.model.TestClass.<init>(TestClass.java:57)
    at org.junit.runners.ParentRunner.createTestClass(ParentRunner.java:88)
    at org.junit.runners.ParentRunner.<init>(ParentRunner.java:83)
    at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
    at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:49)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: java.lang.ClassNotFoundException: fr.orsys.tp2junit.prestation.Collaborateur
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 18 more

Если у кого-либо есть какие-либо идеи относительно как решить эту проблему, которая была бы действительно опрятной, в противном случае, я думаю, мне просто нужно будет переключиться на использование Eclipse, что немного обидно, потому что мне действительно нравится Intellij.

1 Ответ

3 голосов
/ 25 февраля 2020

Пересмешивание не должно игнорировать ошибки компиляции. Пересмешивание изменяет поведение в время выполнения .

Basi c Компиляция не "наполовину компилируется" класс, как в API, но терпит неудачу при вызове метода, но просто не должен генерировать файл .class, и поэтому вы даже не можете загрузить класс.

Дело в том, что компилятор eclipse пытается фактически "полукомпилировать" «класс, такой, что определение готово, но не удается при вызове не скомпилированного кода (см. здесь ), так что это должно объяснить, почему в eclipse это работает, но это не особенность система пересмешки, скорее функция / ошибка компилятора eclipse.

Что касается переключения на eclipse, я бы предложил не переключаться на eclipse для этого, потому что полагаться на такую ​​функцию кажется опасным, и вы не должны пытаться запустить не скомпилированный класс (подробнее здесь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...