6.1 khẳng định

Xác nhận là các kiểm tra đặc biệt có thể được chèn vào các vị trí khác nhau trong mã. Nhiệm vụ của họ là xác định rằng đã xảy ra sự cố. Hay đúng hơn, để kiểm tra xem mọi thứ có diễn ra như bình thường không. Đây là "khi cần thiết" và họ cho phép bạn thiết lập nó theo nhiều cách khác nhau.

Bạn đã gặp phải một số xác nhận trong đoạn mã trên. Đầu tiên là kiểm tra các đối tượng cho bình đẳng. Nếu các đối tượng không bằng nhau, một ngoại lệ sẽ được đưa ra và thử nghiệm sẽ thất bại.

Thứ tự so sánh rất quan trọng ở đây , bởi vì JUnit trong báo cáo cuối cùng sẽ viết một cái gì đó như “giá trị 1 đã nhận được, nhưng giá trị 3 đã được mong đợi”. Định dạng chung cho một kiểm tra như vậy là:

assertEquals(standard , meaning)

Ví dụ:

@Test
public void whenAssertingEquality () {
    String expected = "3.1415";
    String actual = "3";

    assertEquals(expected, actual);
}

6.2 Các phương thức assertEquals, assertTrue, assertFalse

Dưới đây tôi sẽ liệt kê các phương pháp phổ biến nhất - các xác nhận. Theo tên của họ, hoàn toàn có thể đoán được cách họ làm việc. Nhưng dù sao tôi cũng sẽ viết một lời giải thích ngắn gọn:

khẳng địnhEquals Kiểm tra xem hai đối tượng có bằng nhau không
khẳng địnhArrayEquals Kiểm tra xem hai mảng có chứa các giá trị bằng nhau không
khẳng địnhNotNull Kiểm tra nếu đối số không phải là null
khẳng địnhNull Kiểm tra nếu đối số là null
khẳng địnhKhông giống nhau Kiểm tra xem hai đối số có phải là cùng một đối tượng không
khẳng địnhSame Kiểm tra xem hai đối số có phải là cùng một đối tượng không
khẳng địnhTrue Kiểm tra xem đối số có đúng không
khẳng địnhSai Kiểm tra nếu đối số là sai

Một số phương pháp này có vẻ dư thừa. Tại sao lại sử dụng assertSame(a, b) khi bạn chỉ có thể viết assertTrue(a == b) ?

Vấn đề là khẳng định là một phương pháp rất thông minh. Nó thực hiện rất nhiều điều hữu ích, bao gồm ghi thông tin lỗi vào nhật ký . Trong trường hợp đầu tiên, nó sẽ viết rằng đối tượng A đã được mong đợi, nhưng đối tượng B đã được nhận. Trong trường hợp thứ hai, nó sẽ chỉ viết rằng đúng như mong đợi .

Khi bạn có hàng trăm bài kiểm tra, đặc biệt là những bài kiểm tra đang chạy trên máy chủ kiểm tra chuyên dụng, việc có nhật ký chi tiết có thể cực kỳ hữu ích. Tôi nghĩ rằng bạn hiểu những gì tôi có ý nghĩa.

Ví dụ so sánh mảng:

@Test
public void whenAssertingArraysEquality() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();

    assertArrayEquals(expected, actual);
}

6.3 phương thức assertAll

Như đã đề cập ở trên, phương thức khẳng định không chỉ thực hiện kiểm tra mà còn ghi nhiều thông tin về các đối tượng có thể so sánh được vào nhật ký.

Hãy làm một phép so sánh:

Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

Nhưng nếu một trong các tham số không khớp, thì phần còn lại sẽ không được kiểm tra. Nhưng tôi muốn chúng vẫn xảy ra và kết quả của chúng được ghi lại trong nhật ký. Nhưng đồng thời, nếu ít nhất một lần kiểm tra không thành công, thì lần kiểm tra đó vẫn không thành công.

Có một phương pháp đặc biệt cho việc này - assertAll() . Là đối số đầu tiên, cần có một nhận xét được ghi vào nhật ký và sau đó là bất kỳ hàm xác nhận nào.

Đây là cách ví dụ của chúng tôi sẽ được viết lại với nó:

Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
    () -> assertEquals("Washington", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

Sau đó, nếu địa chỉ không chính xác, nội dung như thế này sẽ được ghi vào nhật ký:

	Complex scenario comparison address (3 failures)
	expected: <Washington> but was: <Seattle>
    expected: <Oracle Parkway> but was: <Main Street>
    expected: <500> but was: <5772>

6.4 phương thức assertTimeout

Nhớ chú thích @Timeout ? Nó cho phép kiểm soát thời gian thực hiện của toàn bộ phương thức. Nhưng đôi khi sẽ hữu ích khi đặt các hạn chế đối với việc thực thi một số phần mã bên trong phương thức. Bạn có thể sử dụng assertTimeout() cho việc này .

Thời gian được truyền dưới dạng tham số đầu tiên và mã (hàm) phải được thực thi trong khoảng thời gian đã chỉ định được truyền dưới dạng tham số thứ hai. Ví dụ:

@Test
public void whenAssertingTimeout() {
    assertTimeout(
  	ofSeconds(2),
  	() -> {
    	// pause for one second
    	Thread.sleep(1000);
  	}
	);
}

Lớp Assert có 12 biến thể của phương thức assertTimeout() . Nếu bạn muốn tìm hiểu thêm về chúng, chào mừng bạn đến với tài liệu chính thức .

6.5 Phương thức assertThrow

Rất thường xuyên có những tình huống khi bạn cần đảm bảo rằng trong một tình huống nhất định, mã sẽ đưa ra đúng ngoại lệ: nó phát hiện lỗi và đưa ra đúng ngoại lệ. Đây là một tình huống rất phổ biến.

Trong trường hợp này, có một phương thức xác nhận hữu ích khác - đây là assertThrows() . Định dạng chung của cuộc gọi của nó là:

assertThrows(exception , code)

Về cơ bản, nó rất giống với phương thức assertTimeout() , chỉ khác là nó kiểm tra xem mã được chỉ định có đưa ra đúng ngoại lệ hay không. Ví dụ:

@Test
void whenAssertingException() {
    Throwable exception = assertThrows(
  	IllegalArgumentException.class,
  	() -> {
      	throw new IllegalArgumentException("Exception message");
  	}
    );
    assertEquals("Exception message", exception.getMessage());
}