JUnit测试失败,但结果是预期的?

时间:2013-02-03 18:17:19

标签: java junit

我们的老师给了我们一个与他自己的junit测试课一起编写一个非常简单的程序的任务。我已经这样做了,但我不太明白我是否得到了正确的结果,或者是否整个事情都被打破了。

这是我们正在测试的类(我写的那个):

package person;

public class Person {
    private String name;
    private char sex;

    public Person(String name, char sex) {
        if(name == null || name.equals(""))
            throw new IllegalArgumentException();
        if(sex != 'M' || sex != 'F')
            throw new IllegalArgumentException();

        this.name = name;
        this.sex = sex;
    }

    public void setName(String name) {
        if(name == null || name.equals(""))
            throw new IllegalArgumentException();
        this.name = name;
    }

    public void setSex(char sex) {
        if(sex != 'M' || sex != 'F')
            throw new IllegalArgumentException();
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public char getSex() {
        return sex;
    }
}

这是JUnit测试类:

package parameterchecking;

import person.Person;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 *
 * @author andersb
 */
public class PersonTest2 {

  @Test
  public void constructor() {
    try {
      new Person(null, 'F');
      fail("Should throw exception");
    } catch (IllegalArgumentException ex) { /* expected */ }

    try {
      new Person("", 'F');
      fail("Should throw exception");
    } catch (IllegalArgumentException ex) { /* expected */ }

    try {
      new Person("Anders", 'W');
      fail("Should throw exception");
    } catch (IllegalArgumentException ex) { /* expected */ }
  }

  @Test
  public void setSex() {
    final Person person = new Person("SomeName", 'M');
    try {
      person.setSex('L');
            fail("Should throw exception");
    } catch (IllegalArgumentException ex) { /* expected */ }

    person.setSex('F');
    assertSame('F', person.getSex());
  }

  @Test
  public void setName() {
    final Person person = new Person("Anders", 'M');
    try {
      person.setName(null);
            fail("Should throw exception");
    } catch (IllegalArgumentException ex) { /* expected */ }

    try {
      person.setName("");
            fail("Should throw exception");
    } catch (IllegalArgumentException ex) { /* expected */ }

    person.setName("Henrik");
    assertEquals("Henrik", person.getName());
  }

}

现在,构造函数测试通过,但setName和setSex没有。他们抛出一个错误“java.lang.IllegalArgumentException”。我不明白他们为什么不通过测试。

JUnit暗示问题是在每个测试开始时创建“有效”对象(最终Person人员),并且说问题是我抛出了非法的参数异常,这实际上不应该发生。

2 个答案:

答案 0 :(得分:5)

if(sex != 'M' || sex != 'F')

应该是

if(sex != 'M' && sex != 'F')

答案 1 :(得分:0)

Person类

存在一个小问题
    if(sex != 'M' || sex != 'F')

    if(sex != 'M' && sex != 'F')