JUnit Test无法找到要测试的类

时间:2016-03-18 20:41:42

标签: java unit-testing junit

我目前正在编写一个简单方法的JUnit单元测试用例。这是有问题的方法:

public static Integer[] findUnpairedNumbers(Integer[] numbers) {
    // catches if passed array is empty or uninitialized 
    if (numbers == null) {
        throw new IllegalArgumentException();
    }
    // HashSet initialized to store unpaired numbers
    HashSet<Integer> result = new HashSet<Integer>();
    // Loop through numbers array
    for (int next: numbers) {
        // if HashSet already contains next element, remove that element from the HashSet
        if (result.contains(next)) {
            result.remove(next);
        }
        // Otherwise, add it to the HashSet
        else {
            result.add(next);
        }
    }
    // return the HashSet of unpaired numbers, converting to back to Integer array
    return result.toArray(new Integer[result.size()]);
}

这是我写的JUnit测试:

package program;

import static org.junit.Assert.*;

import org.junit.Test;

public class FindUnpairedTest {

    @Test
    public void test() {
        Integer[] numbers = {1, 2, 4, 5, 7, 7, 8, 8, 9, 1, 5};
        Integer[] unpairedCheck = {2, 4};
        Integer[] unpaired = findUnpairedNumbers(numbers);

        if (unpaired != unpairedCheck) {
            fail();
        }
    }
}

但是,测试类无法识别findUnpairedNumbers类。它在同一个包中。我还需要进口其他东西吗?我在哪里错了?

另外请告诉我,如果任何语法是非正统的,或者我还有其他方法可以改进我的测试用例。

2 个答案:

答案 0 :(得分:3)

  

但是,测试类无法识别findUnpairedNumbers类。它在同一个包中。我还需要进口其他东西吗?

findUnpairedNumbers某些类的静态方法。要调用它,您必须指定它存在于哪个类中。

像这样:

Integer[] unpaired = NameOfTheClass.findUnpairedNumbers(numbers);

测试方法

  

另外请告诉我,如果任何语法是非正统的,或者我还有其他方法可以改进我的测试用例。

不要直接使用fail()。通常,我们在测试的断言阶段从JUnit调用assertSomething()方法(例如assertEquals())。在您的情况下,我建议assertArrayEquals()

@Test
public void test() {
    Integer[] numbers = {1, 2, 4, 5, 7, 7, 8, 8, 9, 1, 5};
    Integer[] unpaired = findUnpairedNumbers(numbers);

    Integer[] expectedUnpaired = {2, 4};
    assertArrayEquals(expectedUnpaired, unpaired);
}

注意测试如何变得更清洁。 我还建议您将测试方法名称重命名为更能描述行为的内容:

@Test
public void findUnpairedNumbersLeavesOnlyNumbersWithoutPairs() { ...

这将使维护者更容易获得测试的意图和预期的行为(如果将来失败)。

有关静态问题的更多信息

更完整的解释/示例:

假设findUnpairedNumbers方法属于名为FindUnpaired的类:

package program;
public class FindUnpaired {
    public static Integer[] findUnpairedNumbers(Integer[] numbers) {
        ...
        return result.toArray(new Integer[result.size()]);
    }
}

现在,在您的测试类中,您可以使用它:

package program;
import static org.junit.Assert.*;
import org.junit.Test;
public class FindUnpairedTest {
    @Test
    public void test() {
        Integer[] numbers = {1, 2, 4, 5, 7, 7, 8, 8, 9, 1, 5};
        Integer[] unpairedCheck = {2, 4};
        Integer[] unpaired = FindUnpaired.findUnpairedNumbers(numbers);
//                           ^^^^^^^^^^^^----------------------------------- changed here
        if (unpaired != unpairedCheck) {
            fail();
        }
    }
}

其他考虑因素:

  • 您可以直接使用FindUnpaired,因为我们假设测试类位于同一个包中。如果软件包不同,您必须在测试类中导入FindUnpaired

    package someOtherPackage;
    import program.FindUnpaired;
    public class FindUnpairedTest {
    
  • 另一种选择是使用static方法的 findUnpairedNumbers导入。如果你遵循这条路线,你在调用它时不需要加前缀(称之为它是当前类中声明的静态方法)。

    import static program.FindUnpaired.findUnpairedNumbers; // static import
    public class FindUnpairedTest {
        ...
        Integer[] unpaired = findUnpairedNumbers(numbers); // no need to prefix
    

答案 1 :(得分:0)

  1. 你应该创建一个对象来调用你想在testClass中测试的方法,然后调用方法obj.findUnpairedNumbers()
    1. 您应该将方法调用为静态并调用YourClass.findUnpairedNumbers()