【问题标题】:Junit test cases ListJunit 测试用例列表
【发布时间】:2018-07-21 07:03:15
【问题描述】:

试图确保我了解 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;

    }

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

【问题讨论】:

  • 您应该根据实际值断言预期值。如果您希望 List 为空,则执行如下断言:assertEquals(0 /* expected */, list.size() /* actual */)
  • @trylimits 好的,谢谢,我切换到我的第一个测试用例并且它有效。你知道我应该为另外两个做什么吗?
  • 做同样的事情:根据期望值断言。添加一本书后,您会期望篮子中恰好包含一本书。所以像这样断言:assertEquals(1 /* expected */, list.size()).
  • @trylimits 的问题是尝试一下,如果我输入 0 1 或 2,它仍然会出现

标签: java unit-testing arraylist junit tdd


【解决方案1】:

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

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

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

恕我直言,您的班级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);

  }
}

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2020-03-20
    • 2023-03-30
    相关资源
    最近更新 更多