Table of Contents
ToggleTesting with AssertJ Object in Java
提供驗證物件條件判斷等方法,編寫的測試程式使用流暢的斷言語句,通常與 JUnit 測試一起使用, AssertJ 斷言的基本方法是 assertThat 方法,使用 Testing Java AssertJ Object 流式斷言,本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- spring_boot_168
| +- test
| +- assertj
| +- object
| +- TestingAssertJObjectTest.java
單元測試
Java AssertJ Object Testing 斷言物件的主要目的是取得物件以進行斷言。
Fruit
建立 Fruit 類別,覆寫 toString ,定義屬性和方法,用來建立一個物件。
@NoArgsConstructor
@Getter
@Setter
public static class Fruit {
private String name;
private double quantity;
private int type;
private List<String> origins = new ArrayList<>();
public Fruit(String name, double quantity, int type) {
this.name = name;
this.quantity = quantity;
this.type = type;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE);
builder.appendSuper(super.toString());
builder.append("name", name);
builder.append("quantity", quantity);
builder.append("type", type);
builder.append("origins", origins);
return builder.toString();
}
}
isLessThan
驗證物件是否小於指定值,若不成立,則會拋出 AssertionError 。
@Test
public void isLessThan() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
assertThat(value).extracting("type").asInstanceOf(INTEGER).isLessThan(3);
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).isLessThan(2d);
}
{"name":"Pomelo","quantity":1.0,"type":2}
isLessThanOrEqualTo
Java AssertJ Object Testing 驗證物件是否小於或等於指定值,若不成立,則會拋出 AssertionError 。
@Test
public void isLessThanOrEqualTo() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
assertThat(value).extracting("type").asInstanceOf(INTEGER).isLessThanOrEqualTo(2).isLessThanOrEqualTo(3);
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).isLessThanOrEqualTo(1d).isLessThanOrEqualTo(2d);
}
{"name":"Pomelo","quantity":1.0,"type":2}
isGreaterThan
Java AssertJ Object Testing 驗證物件是否大於指定值,若不成立,則會拋出 AssertionError 。
@Test
public void isGreaterThan() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
assertThat(value).extracting("type").asInstanceOf(INTEGER).isGreaterThan(1);
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).isGreaterThan(0d);
}
{"name":"Pomelo","quantity":1.0,"type":2}
isGreaterThanOrEqualTo
Java AssertJ Object Testing 驗證物件是否大於或等於指定值,若不成立,則會拋出 AssertionError 。
@Test
public void isGreaterThanOrEqualTo() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
assertThat(value).extracting("type").asInstanceOf(INTEGER).isGreaterThanOrEqualTo(2).isGreaterThanOrEqualTo(1);
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).isGreaterThanOrEqualTo(1d)
.isGreaterThanOrEqualTo(0d);
}
{"name":"Pomelo","quantity":1.0,"type":2}
usingDefaultComparator
Java Testing AssertJ Object 使用預設比較器,驗證物件是否符合條件判斷,若不成立,則會拋出 AssertionError 。
@Test
public void usingDefaultComparator() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
assertThat(value).extracting("type").asInstanceOf(INTEGER).isPositive().isCloseTo(-3, within(5)).isCloseTo(7,
within(5));
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).isPositive().isCloseTo(-4d, within(5d))
.isCloseTo(-4d, within(6d));
}
{"name":"Pomelo","quantity":1.0,"type":2}
usingComparator
Java Testing AssertJ Object 使用自定義比較器,驗證物件是否符合條件判斷,若不成立,則會拋出 AssertionError 。
@Test
public void usingComparator() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
Comparator<Integer> abs = (i1, i2) -> Integer.compare(i1, Math.abs(i2));
assertThat(value).extracting("type").asInstanceOf(INTEGER).usingComparator(abs).isEqualTo(-2);
Comparator<Double> doubleAbs = (d1, d2) -> Double.compare(d1, Math.abs(d2));
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).usingComparator(doubleAbs).isEqualTo(-1d);
}
{"name":"Pomelo","quantity":1.0,"type":2}
usingComparatorWithDescription
Java Testing AssertJ Object 使用自定義比較器及描述,驗證物件是否符合條件判斷,顯示自定義訊息。
@Test
public void usingComparatorWithDescription() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
Comparator<Integer> abs = (i1, i2) -> Integer.compare(i1, Math.abs(i2));
assertThat(value).extracting("type").asInstanceOf(INTEGER).usingComparator(abs, "abs").isEqualTo(-2);
Comparator<Double> doubleAbs = (d1, d2) -> Double.compare(d1, Math.abs(d2));
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).usingComparator(doubleAbs, "doubleAbs")
.isEqualTo(-1d);
}
{"name":"Pomelo","quantity":1.0,"type":2}
TestingAssertJObjectTest.java
Java Testing AssertJ Object 新增單元測試,驗證是否符合預期。
package org.ruoxue.spring_boot_168.test.assertj.object;
import static org.assertj.core.api.Assertions.*;
import java.util.Comparator;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.junit.jupiter.api.Test;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
public class TestingAssertJObjectTest {
@NoArgsConstructor
@Getter
@Setter
public static class Fruit {
private String name;
private double quantity;
private int type;
public Fruit(String name, double quantity, int type) {
this.name = name;
this.quantity = quantity;
this.type = type;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE);
builder.appendSuper(super.toString());
builder.append("name", name);
builder.append("quantity", quantity);
builder.append("type", type);
return builder.toString();
}
}
@Test
public void isLessThan() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
assertThat(value).extracting("type").asInstanceOf(INTEGER).isLessThan(3);
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).isLessThan(2d);
}
@Test
public void isLessThanOrEqualTo() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
assertThat(value).extracting("type").asInstanceOf(INTEGER).isLessThanOrEqualTo(2).isLessThanOrEqualTo(3);
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).isLessThanOrEqualTo(1d).isLessThanOrEqualTo(2d);
}
@Test
public void isGreaterThan() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
assertThat(value).extracting("type").asInstanceOf(INTEGER).isGreaterThan(1);
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).isGreaterThan(0d);
}
@Test
public void isGreaterThanOrEqualTo() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
assertThat(value).extracting("type").asInstanceOf(INTEGER).isGreaterThanOrEqualTo(2).isGreaterThanOrEqualTo(1);
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).isGreaterThanOrEqualTo(1d)
.isGreaterThanOrEqualTo(0d);
}
@Test
public void usingDefaultComparator() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
assertThat(value).extracting("type").asInstanceOf(INTEGER).isPositive().isCloseTo(-3, within(5)).isCloseTo(7,
within(5));
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).isPositive().isCloseTo(-4d, within(5d))
.isCloseTo(-4d, within(6d));
}
@Test
public void usingComparator() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
Comparator<Integer> abs = (i1, i2) -> Integer.compare(i1, Math.abs(i2));
assertThat(value).extracting("type").asInstanceOf(INTEGER).usingComparator(abs).isEqualTo(-2);
Comparator<Double> doubleAbs = (d1, d2) -> Double.compare(d1, Math.abs(d2));
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).usingComparator(doubleAbs).isEqualTo(-1d);
}
@Test
public void usingComparatorWithDescription() {
Object value = new Fruit("Pomelo", 1, 2);
System.out.println(value);
Comparator<Integer> abs = (i1, i2) -> Integer.compare(i1, Math.abs(i2));
assertThat(value).extracting("type").asInstanceOf(INTEGER).usingComparator(abs, "abs").isEqualTo(-2);
Comparator<Double> doubleAbs = (d1, d2) -> Double.compare(d1, Math.abs(d2));
assertThat(value).extracting("quantity").asInstanceOf(DOUBLE).usingComparator(doubleAbs, "doubleAbs")
.isEqualTo(-1d);
}
}
心得分享
AssertJ Object Java Testing 除了提供流式判斷,還針對 Object 做特殊判斷,在許多測試驗證的場景,讓開發者使用更流暢的驗證,不需要再寫迴圈,善用 Java Testing AssertJ Object 將有助於驗證效率的提升。