2013-10-15 7 views
0

Я работаю над упражнением Java в Eclipse, чтобы добавить тесты JUnit к существующему проекту. Это не назначение или что-то еще, просто способ привыкнуть к Eclipse (ранее я использовал BlueJ). Однако два метода тестирования, которые я написал, похоже, не работают. По некоторым причинам объекты Circle, которые я создал (у которых есть поле радиуса, которое я установил как 6, 8 и от 2 до трех разных кругов), по умолчанию не имеют значения радиуса 0, поэтому оба моих метода тестирования (фактически, отчет для работы, но это потому, что он проверяет окружность> = 0) терпит неудачу. Что я сделал не так? Я не опытный программист, поэтому ошибка может быть очевидна для большинства из вас.Тест JUnit на метод getter не работает

import static org.junit.Assert.*; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 


public class CircleTest { 
    Circle circle1; 
    Circle circle2; 
    Circle circle3; 
@Before 
public void setUp() throws Exception { 

    circle1 = new Circle(6.00); 
    circle2 = new Circle(8.00); 
    circle3 = new Circle(2.00); 
} 




@Test 
public void testCircumference() { 
    assertTrue(circle1.circumference() >= 0); 
    assertTrue(circle2.circumference() >= 0); 
    assertTrue(circle3.circumference() >= 0); 

} 

@Test 
public void testGetter() { 
    assertEquals(6, circle1.getRadius(), 1e-15); 
    assertEquals(8, circle2.getRadius(), 1e-15); 
    assertEquals(2, circle3.getRadius(), 1e-15); 

} 

@After 
public void tearDown() throws Exception { 
} 

} 
+3

Выглядит хорошо. Я подозреваю ваш класс «Круг». Можете ли вы опубликовать это тоже? –

+0

Это поможет, если вы также опубликуете исходный код класса Circle. – helpermethod

ответ

1

Более вероятно, значение, возвращаемое getRadius значение по умолчанию 0.0 для double примитивных типов

Убедитесь, что радиус задается в конструкторе Circle

public Circle(double radius) { 
    this.radius = radius; 
} 

так, что значение могут быть возвращены getRadius

public double getRadius() { 
    return radius; 
} 
0

Взгляните: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
В 2 слова: плавающие точки не должны сравниваться с помощью равных - вы должны сравнить их по абсолютной разности: а - Ь < 0,00001, например.
Я думаю, это корень проблемы здесь.

+0

assertEquals() для плавающих типов принимает допуски, фактически делая именно то, что вы предлагаете. Использование OP assertEquals() является правильным. –

+0

Ничего себе, не знал этого. Очень интересно. Обычно я удаляю свои неправильные ответы, но я уйду из-за вашего комментария. – popfalushi

0

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

http://junit.sourceforge.net/javadoc/org/junit/Assert.html#assertEquals%28double,%20double,%20double%29

Таким образом, вы бы использовать, например,

assertEquals(6, circle1.getRadius(), 0.0001); 
+0

Это '1e-15' в примере OP - это то же самое (так называемая« дельта ») как' 0,0001' в вашем, за исключением гораздо меньшего числа для более точного сравнения. – theUg

0

Ошибка должна быть в Circle классе. У ваших тестов, хотя у них есть некоторые незначительные недостатки, все в порядке.

  1. Поскольку вы используете JUnit 4 аннотаций, вам не нужно назвать свой @Before метод setUp.
  2. Вам не нужен метод tearDown, так как он пуст. Вам также не нужно называть его tearDown.
  3. Эти классы должны иметь только один assert, были ли что-то неправильно с circle1, вы никогда не проверите circle2 и circle3. Фактически, вы должны посмотреть параметризованные тесты JUnit.

Каким должен быть класс Circle? Вот идея, и некоторые крючки для написания теста.

public class Circle implements Serializable { 
    private static long serialVersionUid = ...; 

    private final double radius; 

    public Circle(final double radius) throws IllegalArgumentException { 
     if (radius <= 0.0) { 
      throw new IllegalArgumentException("Attempt to create a circle with nonpositive radius" + radius); 
     } 
     this.radius = radius; 
    } 
    public double getRadius() {...} 
    public double getCircumference{...} 
} 

Теперь испытание:

  1. new Circle(-10.0) бросков.
  2. new Circle(Double.NaN) throws,
  3. new Circle(10.0) удался.
  4. (new Circle(10.0)).getRadius()10.
  5. (new Circle(10.0)).getCircumference() возвращается примерно 31.4159.
  6. Circle инвентарь Serializable.
Смежные вопросы