Junit测试用例列表

时间:2018-07-21 07:03:15

标签: java unit-testing arraylist junit tdd

试图确保我了解JUnit和TDD。

第一个测试是在添加任何内容之前测试购物篮是否为空。

@Test
public void test_GetBooksInBasket_ReturnEmptyBookList_IfNoBooksHaveBeenAdded(){
    //Arrange
    Basket basket = new Basket();

    //Act
     List<Object> test = basket.getBooksInBasket();


    //Assert
    assertThat(test.size(),is(1));

    System.out.println(test.size());

}

班级

public class Book {

}


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Basket {

private List<Object> bookList = new ArrayList<Object>();

public List<Object> getBooksInBasket(){

    return bookList;
  }

}

只是想知道我是否正确执行了第一个测试用例。由于列表为空,我测试1时失败了。

测试2.与上面相同的代码,但是将一本书添加到购物篮中,并检查购物篮中的图书数量是否等于1。

public void test_GetBooksInBasket_ReturnsArrayOfLengthOne_After_AddBookMethodIsCalledWithOneBook(){
    //Arrange
    Basket basket = new Basket();
    Book book = new Book();

    //Act
List<Object> test = basket.addBook(book);


    //Assert
assertThat(test.size(),is(0));
}
public class Basket {

private List<Object> bookList = new ArrayList<Object>();

public List<Object> getBooksInBasket(){

    return bookList;
}

public  List<Object> addBook(Book book){
    Book book1 = new Book();
    //Book book3 = new Book();
    bookList.add(book1);
    return bookList;



}


}

无论我放入的尺寸如何,都不会失败。

测试3增加了2本书,所以我尝试了

public void test_GetBooksInBasket_ReturnsArrayOfLengthOne_After_AddBookMethodIsCalledWithOneBook(){
    //Arrange
    Basket basket = new Basket();
    Book book = new Book();

    //Act
List<Object> test = basket.addBook(book,book);


    //Assert
assertThat(test.size(),is(0));
}



public  List<Object> addBook(Book book, Book book1){
    Book book2 = new Book();
    Book book3 = new Book();
    bookList.addAll(Arrays.asList(book2, book3));
    return bookList;

    }

不确定我的第二和第三个测试用例是否正常工作。

1 个答案:

答案 0 :(得分:0)

您的测试类没有自己的行为。它只是将对其方法的调用委派给其内部数据结构。而且,它违反了最重要的OO原则(信息隐藏/封装)。

因此,您的代码验证了测试类的 state 。 但是单元测试应该验证行为,即返回值和/或与依赖项进行通信

这里的问题是被测代码需要一些真实的行为来进行测试。

恕我直言,您的班级Basked所要做的不只是“持有项目”(您可以直接使用ArrayList来实现。也许您的Basket有项目限制,那么您可以通过这种方式验证某些行为:

class BasketWithLimitTest{

  private static final int BASKET_CONTENT_LIMIT = 2;
  @Rule
  public MockitoRule rule = MockitoJUnit.rule();

  @Rule
  public final ExpectedException exception = ExpectedException.none();

  @Mock(name="Book1");
  private book1;
  @Mock(name="Book2");
  private book2;
  @Mock(name="Book3");
  private book3;

  @Test
  public void isInitiallyEmpty(){
     Basket basket new Basket(BASKET_CONTENT_LIMIT);

     basket.add(book1);

     assertThat("not empty", basket.isEmpty(),is(true));
     assertThat("not containing the book1", basket.contains(book1),is(false));
     assertThat("not containing the book2", basket.contains(book2),is(false));
  }
  @Test
  public void firtsBookStoredSuccessfully(){
     Basket basket new Basket(BASKET_CONTENT_LIMIT);

     basket.add(book1);

     assertThat("not empty", basket.isEmpty(),is(false));
     assertThat("contains the book", basket.contains(book1),is(true));
  }
  @Test
  public void throwExceptionWhenLimitExceeded(){
     Basket basket new Basket(BASKET_CONTENT_LIMIT);

     basket.add(book1);
     basket.add(book2);

     exception.expect(RuntimeException.class);
     exception.expectMessage("could not add Book3 because limit of 2 books exceeded");
     basket.add(book3);

  }
}