Новичок ADT и JUnit 4

1

Я делаю простой ADT, у которого есть метод (Add3), который добавляет 3 к заданному int. Код показан ниже:

public class TestADT 
{
    private final int x;

    public TestADT (int x)
    {
        this.x = x;
    }

    public static TestADT Add3(TestADT num)
    {
        int ex = (num.x + 3);
        return (new TestADT(ex));
    }

    public String toString()
    {
        return(x + "");
    }

    public static void main(String[] args)
    {
        TestADT test = new TestADT(2);
        System.out.println(Add3(test));
    }
}

То, что я пытаюсь сделать, это создать JUnit-тест, чтобы проверить, что метод Add3 работает правильно, и до сих пор у меня это:

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class Add3Test 
{
    private TestADT test;
    private TestADT expected;

    @Before
    public void setUp() throws Exception 
    {
        test = new TestADT(2);
        expected = new TestADT(5);
    }

    @Test
    public void test() 
    {
        TestADT result = TestADT.Add3(test);
        assertEquals(expected, result);
    }
}

Когда я запускаю класс тестирования, он терпит неудачу, но я не уверен, почему. Если я напечатаю оба значения (ожидаемый и результат) перед запуском теста, они оба печатают 5.

Я относительно новичок в JUnit и ADT, поэтому я не совсем уверен, что я делаю все правильно. Я попытаюсь найти несколько обучающих видеороликов на JUnit и посмотреть, смогу ли я найти решение. Любая помощь будет оценена!

Теги:
junit
abstract-data-type

3 ответа

0
Лучший ответ

Вы не переопределили equals и hashcode в вашем TestADT. По умолчанию значения equals по ссылке. Это означает, что он проверяет, является ли первый экземпляр второго экземпляра.

Вам нужно переопределить equals и hashcode и сравнить их по x чтобы проверить равенство:

public class TestADT
{
    private final int x;

    public TestADT(int x)
    {
        this.x = x;
    }

    public static TestADT Add3(TestADT num)
    {
        int ex = (num.x + 3);
        return (new TestADT(ex));
    }

    public String toString()
    {
        return(x + "");
    }

    public static void main(String[] args)
    {
        TestADT test = new TestADT(2);
        System.out.println(Add3(test));
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        TestADT testADT = (TestADT) o;

        if (x != testADT.x) return false;

        return true;
    }

    @Override
    public int hashCode() {
        return x;
    }
}

На мой взгляд, это гораздо лучшее решение, чем @azbarcea's. Вам нужно будет реализовать эти методы, если вы хотите поместить свой TestADT в Set или Map и ожидать, что он будет работать правильно.

  • 0
    Сможете ли вы объяснить, что вы подразумеваете под переопределением equals и hashcode?
  • 0
    @PaulWarnick посмотреть мои правки
Показать ещё 4 комментария
0

Как мне написать о тестовых случаях JUnit для простого Java-приложения? Я нашел это Java-приложение @https://www.includehelp.com/java-programs/java-program-to-add-two-distances-using-class.aspx Я начинающий в JUnit, но я пытаюсь научить себя основы. Помощь будет принята с благодарностью.

0

Самый быстрый способ исправить ваш код - использовать:

@Test
public void test() 
{
    TestADT result = TestADT.add3(test);
    assertEquals(expected.toString(), result.toString());
}

Наилучшей практикой является использование нижнего регистра для имен методов: http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню