Нужна помощь с тестированием JUnit - PullRequest
1 голос
/ 24 марта 2019

Я новичок в JUnit, поэтому у меня немного проблем.В настоящее время я использую JUint 4, и я пытаюсь написать тест, который определенно должен провалиться, но он продолжает проходить как успешный.Мне нужна ваша помощь, так как я чувствую, что пишу их правильно, но они работают не так, как задумано.Вот мой основной класс:

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

public class PrimeNumbers implements Iterable<Integer> {
    private List<Integer> primes = new ArrayList<Integer>();

    /*
     * creates a list of n prime numbers
     *
     * @param n - the number of primes to compute silently treats negative
     * arguments as zero
     */
    public void computePrimes(int n) {
        int count = 1; // count of primes
        int number = 2; // number tested for primeness
        boolean isPrime; // is this number a prime

        while (count <= n) {
            isPrime = true;
            for (int divisor = 2; divisor <= number / 2; divisor++) {
                if (number % divisor == 0) {
                    isPrime = false;
                    break; // for loop
                }
            }
            if (isPrime && (number % 10 != 9)) { // THIS IS THE FAULT!!!
                primes.add(number);
                count++;
            }
            number++;
        }
    }

    @Override
    public Iterator<Integer> iterator() {
        return primes.iterator();
    }

    @Override
    public String toString() {
        return primes.toString();
    }

}

и вот мой тестовый класс:

import org.junit.Test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import static org.junit.Assert.*;

public class PrimeNumbersTest {

    @Test
    public void test(){
        //instantiate prime object, create primes list, and iterator
        PrimeNumbers prime = new PrimeNumbers();
        List<Integer> primeList = new ArrayList<Integer>();

        //array holding 19 so I can compare the objects
        int[] primeArray = new int[]{2,3,5,7,11,13,17,19};
        int i = 0;
        int n = 8;
        //call the method
        prime.computePrimes(n);
        Iterator<Integer> primeIterator = primeList.iterator();
        //loop to iterate through the list and then check last item if it is equal to 19
        while(primeIterator.hasNext()){
            if(!(primeIterator.equals(primeArray[i]))) {
                assertTrue("incorrect", primeIterator.equals(primeArray[i]));
            }
            i++;
            primeIterator.next();
        }
    }
}

Спасибо, ребята, за помощь!

1 Ответ

2 голосов
/ 25 марта 2019

Посмотрите на эти две строки:

List<Integer> primeList = new ArrayList<Integer>();
...
Iterator<Integer> primeIterator = primeList.iterator();

Вы создаете пустой список и затем проверяете содержимое этого списка. Поскольку в этом списке ничего нет, ваш код никогда не входит в цикл while и, следовательно, тестовое утверждение никогда не вызывается.

Если вы замените это ...

Iterator<Integer> primeIterator = primeList.iterator();

... с этим ...

Iterator<Integer> primeIterator = prime.iterator();

... тогда вы будете тестировать итератор, созданный вашим PrimeNumbers классом. Это должно быть то, что вы хотите сделать, хотя следует отметить, что этот вызов всегда будет возвращать false: primeIterator.equals(primeArray[i]) (поскольку он сравнивает итератор, а не значение внутри итератора с «ожидаемым» массивом), поэтому ваш тест потерпит неудачу на своей первой итерации в цикле while. Это был бы ложный минус.

Похоже, вы пытаетесь доказать, что PrimeNumbers (который был закодирован как , а не возвращает 19) не возвращает 19, когда его просят вернуть первые 8 простых чисел. Если это так, то следующий способ может быть более компактным и конкретным способом сделать это:

@Test
public void test() {
    //instantiate prime object, create primes list, and iterator
    PrimeNumbers prime = new PrimeNumbers();

    int n = 8;
    int unexpectedPrimeNumber = 19;

    // call the method
    prime.computePrimes(n);

    // gather the generated prime numbers into a list for easier assertion
    List<Integer> primeList = new ArrayList<>();
    prime.iterator().forEachRemaining(integer -> primeList.add(integer));

    assertEquals("Should contain " + n + " prime numbers!", n, primeList.size());
    assertFalse("Should not contain the unexpected prime number: " + unexpectedPrimeNumber, primeList.contains(unexpectedPrimeNumber));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...