Тест JUnit метода компилируется и показывает несколько маркеров ошибок - PullRequest
0 голосов
/ 04 января 2019

Я новичок в модульном тестировании и не понимаю, почему следующий код не работает. У меня есть этот метод:

public class TaxTime {


public static void main(String[] args) {
   ...
}

public static double calculateFamilyTaxSaving(double taxAmount, int familyMembers) {
  for (int i = 0; i <= familyMembers; i++){
       taxAmount = taxAmount - 100;
   }
   return taxAmount;
 }

И я пытаюсь протестировать код с помощью этого класса тестирования:

 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;

 class TaxTimeTest {

  @BeforeEach
  void setUp() throws Exception {
  }

  @Test
  void test() {
    fail("Not yet implemented");

}

@Test
static void stattestCalculateFamilyTaxSaving() {
    TaxTime taxtime = new TaxTime();
    double taxAmount = 600;
    int familyMembers = 3;
     assertTrue(taxtime.calculateFamilyTaxSaving(taxAmount,familyMembers).equals(200.0));
 }
}

Несмотря на то, что код не компилируется, и я получаю это сообщение:

Несколько маркеров в этой строке

  • Невозможно вызвать равно (double) для типа примитива double
  • Статический метод CalculateFamilyTaxSaving (double, int) из типа TaxTime должен быть доступен статическим способом

Может ли кто-нибудь помочь мне понять, что я делаю неправильно? Я думаю, что упускаю что-то действительно важное.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Существует много ошибок в коде, который вы включили. Я начну с некоторого кода, затем объясню.

public class TaxTime {
  public static double calculateFamilyTaxSaving(double taxAmount, int familyMembers) {
    for (int i = 0; i <= familyMembers; i++) {
         taxAmount = taxAmount - 100;
    }

    return taxAmount;
  }
}

public class TaxTimeTest {
  @BeforeEach
  void setUp() throws Exception {
    // only use this if you actually do some initialization before each test.
  }

  @Test
  void whatEverTestMethodNameYouWantToUse() {
    double actualDoubleResult;
    BigDecimal actualBigDecimalResult;
    BigDecimal expectedBigDecimal = new BigDecimal(300.0);
    TaxTime taxtime = new TaxTime();
    double taxAmount = 600;
    int familyMembers = 3;

    actualDoubleResult = taxtime.calculateFamilyTaxSaving(taxAmount,familyMembers);

    actualBigDecimalResult = new BigDecimal(actualDoubleResult);

    assertTrue(0 == expectedBigDecimal.compareTo(actualBigDecimalResult));
  }
}

Некоторое объяснение.

  • Тестовые классы Junit (@Test аннотация) НИКОГДА не должны быть статическими.
  • Тестирование вашего кода усложняется из-за того, что вы неправильно представляете валюту как значение с плавающей запятой (в вашем случае это двойное число).
  • Используйте BigDecimal.compareTo для удвоения значений.
  • Обратите внимание на код, который вы пишете. 600 - 100 - 100 - 100 равно 300. 600 - 100 - 100 - 100 никогда не будет равно 200.

Предостережение: вы используете JUnit 5. У меня почти нет опыта работы с Junit 5. Все, что я упомянул, относится к тесту JUnit 4 и должно также применяться к тесту JUnit 5.

0 голосов
/ 04 января 2019

Примитивный тип double не имеет метода equals. Кроме того, значения double не являются точными (они являются приблизительными) и не должны сравниваться с оператором ==. Объединяя эти две идеи, вы можете протестировать double значения в JUnit, используя:

assertEquals(200.0, Taxtime.calculateFamilyTaxSaving(taxAmount, familyMembers), 0.0001);

Обратите внимание, что JUnit считает первый параметр ожидаемым, поэтому сначала следует использовать литерал 200.0 (ожидаемое значение).

Последнее значение (0.0001) является пороговым. Это говорит о том, что до тех пор, пока первые два значения отличаются меньше или равны пороговому значению, первые два значения считаются равными. Чтобы быть точным, порог определяется как:

threshold such that abs(value1 - value2) <= threshold

Результирующий контрольный пример должен быть:

@Test
static void stattestCalculateFamilyTaxSaving() {
    TaxTime taxtime = new TaxTime();
    double taxAmount = 600;
    int familyMembers = 3;
    assertEquals(200.0, Taxtime.calculateFamilyTaxSavings(taxAmount, familyMembers), 0.0001);
}

Обратите внимание, что Taxtime.calculateFamilyTaxSaving равен static и должен вызываться static (используйте имя класса, а не имя объекта).

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