Я новичок в 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();
}
}
}
Спасибо ребята за помощь!




Взгляните на эти две строки:
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));
}
Ничто явно не указывает тесту на провал, вы уверены, что выполняемый код действительно выполняет строку, содержащую
assertTrue("incorrect", primeIterator.equals(primeArray[i]));?