Skip to the content.
package com.bookshop.creational.simplefactory;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.math.BigDecimal;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

@DisplayName("Simple Factory -- checkout never touches a concrete processor class")
class PaymentProcessorsTest {

    @ParameterizedTest(name = "{0} -> handled by the {1} provider")
    @CsvSource({
            "CARD, card",
            "PAYPAL, paypal",
            "GIFT_CARD, gift-card"
    })
    @DisplayName("the factory maps each payment method to the right implementation")
    void factoryChoosesImplementation(PaymentMethod method, String expectedProvider) {
        PaymentProcessor processor = PaymentProcessors.forMethod(method);

        PaymentReceipt receipt = processor.process(new BigDecimal("19.99"));

        assertEquals(expectedProvider, receipt.provider());
        assertEquals(new BigDecimal("19.99"), receipt.amount());
    }
}

Raw file