试图确保我了解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;
}
不确定我的第二和第三个测试用例是否正常工作。
答案 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);
}
}