Post

Junit and AssertJ

✅ Junit

  • framework to help testing
  • assertEquals

✅ AssertJ

  • APIs to help testing
  • assertThat().isEqualTo()
  • assertThat().hasSize()
  • assertThat().isEmpty()

Manual Testing 🆚 Automatized Testing

  • Manual testing
1
2
3
4
5
6
7
8
    @Test
    void add(){
        CafeKiosk cafeKiosk = new CafeKiosk();
        cafeKiosk.add(new Americano());

        System.out.println(">>> Get total bev num: " + cafeKiosk.getBeverages().size());
        System.out.println(">>> Get bev name: " + cafeKiosk.getBeverages().get(0).getName());
    }
  • Automatized testing
1
2
3
4
5
6
7
8
9
10
    @Test
    void add() {
        CafeKiosk cafeKiosk = new CafeKiosk();
        cafeKiosk.add(new Americano());

        assertThat(cafeKiosk.getBeverages().size()).isEqualTo(1);
        assertThat(cafeKiosk.getBeverages()).hasSize(1);

        assertThat(cafeKiosk.getBeverages().get(0).getName()).isEqualTo("Americano");
    }

JUnit 🆚 AssertJ

1
2
3
4
5
6
7
8
9
    @Test
    void getName() {
        Americano americano = new Americano();
        //JunitAPI
        assertEquals(americano.getName(), "Americano");

        //AssertJ
        assertThat(americano.getName()).isEqualTo("Americano");
    }

✅ Examples of simple test code

☑️ Add one beverage

  • ✔️ production code
1
2
3
4
5
private final List<Beverage> beverages = new ArrayList<>();

public void add(Beverage beverage) {
        beverages.add(beverage);
    }
  • ✔️ test code
1
2
3
4
5
6
7
8
@Test
void add() {
    CafeKiosk cafeKiosk = new CafeKiosk();
    cafeKiosk.add(new Americano());
    assertThat(cafeKiosk.getBeverages().size()).isEqualTo(1);
    assertThat(cafeKiosk.getBeverages()).hasSize(1);
    assertThat(cafeKiosk.getBeverages().get(0).getName()).isEqualTo("Americano");
}

☑️ Add several beverages

  • ✔️ production code
1
2
3
4
5
6
7
8
    public void add(Beverage beverage, int count){
        if(count <= 0){
            throw new IllegalStateException("Can order more than one drink");
        }
        for (int i = 0; i < count; i++) {
            beverages.add(beverage);
        }
    }
  • ✔️ test code
1
2
3
4
5
6
7
8
9
10
11
@Test
void addSeveral() {
    CafeKiosk cafeKiosk = new CafeKiosk();
    Americano americano = new Americano();
    cafeKiosk.add(americano, 10);

    assertThat(cafeKiosk.getBeverages()).hasSize(10);
    assertThat(cafeKiosk.getBeverages().get(0).getName()).isEqualTo("Americano");
    assertThat(cafeKiosk.getBeverages().get(0)).isEqualTo(americano);
    assertThat(cafeKiosk.getBeverages().get(1)).isEqualTo(americano);
}

☑️ Remove a beverage

  • ✔️ production code
1
2
3
4
    public void remove(Beverage beverage) {
        beverages.remove(beverage);
    }

  • ✔️ test code
1
2
3
4
5
6
7
8
9
10
11
@Test
void remove() {
  CafeKiosk cafeKiosk = new CafeKiosk();
  Americano americano = new Americano();
  cafeKiosk.add(americano);
  assertThat(cafeKiosk.getBeverages()).hasSize(1);

  cafeKiosk.remove(americano);
  assertThat(cafeKiosk.getBeverages()).hasSize(0);
  assertThat(cafeKiosk.getBeverages()).isEmpty();
}

☑️ Clear all added beverages

  • ✔️ production code
1
2
3
4
    public void clear() {
        beverages.clear();
    }

  • ✔️ test code
1
2
3
4
5
6
7
8
9
10
@Test
void clear() {
  CafeKiosk cafeKiosk = new CafeKiosk();
  cafeKiosk.add(new Americano());
  cafeKiosk.add(new Latte());
  assertThat(cafeKiosk.getBeverages()).hasSize(2);

  cafeKiosk.clear();
  assertThat(cafeKiosk.getBeverages()).isEmpty();
}

☑️ Calculate total price

  • ✔️ production code
1
2
3
4
5
6
7
public int calculateTotalPrice() {
        int total = 0;
        for (Beverage beverage : beverages) {
            total += beverage.getPrice();
        }
        return total;
    }
  • ✔️ test code
1
2
3
4
5
6
7
8
@Test
void getTotalPrice() {
    CafeKiosk cafeKiosk = new CafeKiosk();
    cafeKiosk.add(new Americano());
    cafeKiosk.add(new Latte());

    assertThat(cafeKiosk.calculateTotalPrice()).isEqualTo(9000);
}

💥 If method throws exception

  • ✔️ production code
  • if count <= 0 cannot add to beverages list
1
2
3
4
5
6
7
8
    public void add(Beverage beverage, int count){
        if(count <= 0){
            throw new IllegalStateException("Can order more than one drink");
        }
        for (int i = 0; i < count; i++) {
            beverages.add(beverage);
        }
    }
  • ✔️ test code
1
2
3
4
5
6
7
8
    @Test
    void addException() {
        CafeKiosk cafeKiosk = new CafeKiosk();
        Americano americano = new Americano();
        assertThatThrownBy(()-> cafeKiosk.add(americano, 0))
          .isInstanceOf(IllegalStateException.class)
          .hasMessage("Can order more than one drink");
    }

⚠️ When an outside factor needs to be tested with exception

  • outside factor: time
  • when creating order,
  • if current time is outside cafe open time, throw exception

  • ✔️ production code
  • 💊 send current time as parameter
1
2
3
4
5
6
7
8
9
10
public Order createOrder(LocalDateTime currentDateTime){
        LocalTime currentTime = currentDateTime.toLocalTime();

        if(currentTime.isBefore(CAFE_OPEN_TIME) || currentTime.isAfter(CAFE_CLOSE_TIME)){
            throw new IllegalStateException("This is not order time. Inquire to manager");
        }


        return new Order(currentDateTime, beverages);
    }
  • ✔️ test code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// inside cafe open time, no exception
@Test
    void createOrderWithCurrentTime() {
        CafeKiosk cafeKiosk = new CafeKiosk();
        Americano americano = new Americano();
        cafeKiosk.add(americano);

        // 💊 send current time as parameter in production code
        Order order = cafeKiosk.createOrder(LocalDateTime.of(2026, 2, 16, 12, 40));

        assertThat(order.getBeverages()).hasSize(1);
        assertThat(order.getBeverages().get(0).getName()).isEqualTo("Americano");
    }

// outside cafe open time, 💥 throw exception
@Test
    void createOrderOutsideCurrentTime() {
        CafeKiosk cafeKiosk = new CafeKiosk();
        Americano americano = new Americano();
        cafeKiosk.add(americano);

        // 💊 send current time as parameter in production code
        assertThatThrownBy(()->cafeKiosk.createOrder(LocalDateTime.of(2026, 2, 16, 9, 59)))
                .isInstanceOf(IllegalStateException.class)
                .hasMessage("This is not order time. Inquire to manager");
    }

  • ✔️ production code
1
  • ✔️ test code
1
This post is licensed under CC BY 4.0 by the author.