InstantiationException, брошенный для моего расширения класса - PullRequest
0 голосов
/ 07 апреля 2020

Я написал следующий класс, остальная часть кода в этом классе - @Overrides, пожалуйста, дайте мне знать, если здесь важен остальной код, и я добавлю его.

public class ListCmd extends LibraryCommand {

    public ListCmd(String argumentInput) {
        super(CommandType.LIST, argumentInput);
    }

...

Что, когда мои тесты запускаются, я получаю InstantiationException's.

Глядя на API, я пытался go через то, что вызывает эту ошибку и сужает ее, но безрезультатно, вот журналы для одного из ошибки.


java.lang.InstantiationException
    at java.base/jdk.internal.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
    at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
    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.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    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)

Я запускаю этот тест

import org.junit.Before;

import java.util.ArrayList;
import java.util.List;

public abstract class ListCmdTest extends CommandTest {

    protected static final String SHORT_ARGUMENT = "short";
    protected static final String LONG_ARGUMENT = "long";

    @Override
    protected CommandType getCmdType() {
        return CommandType.LIST;
    }

    @Before
    public void setup() {
        testCommand = new ListCmd(SHORT_ARGUMENT);

        testLibrary = new LibraryData();
        List<BookEntry> bookData = new ArrayList<>();
        bookData.add(new BookEntry("TitleA", new String[]{"AuthorA"}, 3.2f, "ISBNA", 500));
        bookData.add(new BookEntry("TitleB", new String[]{"AuthorB"}, 4.3f, "ISBNB", 400));
        bookData.add(new BookEntry("TitleC", new String[]{"AuthorC"}, 1.3f, "ISBNC", 300));
        FieldTestUtils.setPrivateField(testLibrary, testLibrary.getClass(), "books", bookData);
    }
}

А затем эти тесты не пройдены


import org.junit.Test;

import static org.junit.Assert.assertEquals;

public abstract class CommandTest {

    protected static final String TITLE_ARGUMENT = "TITLE";
    protected static final String AUTHOR_ARGUMENT = "AUTHOR";

    protected static final String BLANK_ARGUMENT = "";

    protected LibraryCommand testCommand;
    protected LibraryData testLibrary;

    public CommandTest() {
        testCommand = null;
        testLibrary = null;
    }

    protected abstract CommandType getCmdType();

    // ------------------------- initialisation tests --------------------

    @Test
    public void testClassCommandExtension() {
        assertEquals(testCommand.getClass() + " has unexpected superclass.", LibraryCommand.class,
                testCommand.getClass().getSuperclass());
    }

    @Test
    public void testCtorSuperclassCall() {
        CommandTestUtils.checkCtorSuperclassCall(testCommand, getCmdType());
    }

    // ------------------------- parseArguments tests --------------------

    @Test
    public void testIsParseArgumentsOverridden() {
        CommandTestUtils.checkIfParseArgumentsIsOverridden(testCommand);
    }

    // ------------------------- execute tests --------------------

    @Test(expected = NullPointerException.class)
    public void testExecuteLibraryDataNull() {
        testCommand.execute(null);
    }

``

1 Ответ

2 голосов
/ 07 апреля 2020

Из javado c из InstantiationException:

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

  • объект класса представляет абстрактный класс , интерфейс, класс массива, тип примитива или void
  • класс не имеет нулевого конструктора

Ваш класс ListCmdTest равен abstract, поэтому jUnit не может его создать.

...