0

私たちの先生は、彼自身の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 人) での「有効な」オブジェクトの作成であることをほのめかし、実際には発生してはならない不正な引数の例外をスローすることが問題であると述べています。

4

2 に答える 2

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

する必要があります

if(sex != 'M' && sex != 'F')
于 2013-02-03T18:21:44.917 に答える
0

Person クラスには小さな問題があります

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

    if(sex != 'M' && sex != 'F')
于 2013-02-03T18:54:30.537 に答える