DEV Community

ben watkins
ben watkins

Posted on • Edited on

spring boot test husky

@Service
@AllArgsConstructor
public class CustomerService {

    private final CustomerRepository customerRepository;
    private final CustomerCriteriaRepository customerCriteriaRepository;

    public List<CustomerDto> getAllCustomers(){
        return toDtoList(customerRepository.findAll());
    }

    public Customer addCustomer(CustomerDto customerDto){
        Customer customer = toEntity(customerDto);
        for (Order order : customer.getOrderList()){
            order.setCustomer(customer);
        }
        return customerRepository.save(customer);
    }

    public CustomerDto getCustomerById(Long id){
        return toDto(customerRepository.findById(id).orElse(null));
    }

    public List<CustomerDto> getCustomerByCriteria(CustomerDto customerDto){
        return toDtoList(customerCriteriaRepository.getCustomerByCriteria(toEntity(customerDto)));
    }

    public CustomerDto toDto(Customer customer){
        return new CustomerDto(customer.getId(), customer.getFirstName(), customer.getLastName(), null, customer.getAge(), customer.getOrderList());
    }

    public Customer toEntity(CustomerDto customerDto){
        Customer customer = new Customer();
        customer.setFirstName(customerDto.firstName());
        customer.setLastName(customerDto.lastName());
        customer.setEmail(customerDto.email());
        customer.setAge(customerDto.age());
        customer.setOrderList(customerDto.orderList());
        return customer;
    }

    public List<CustomerDto> toDtoList(List<Customer> customers){
        List<CustomerDto> customerDtos = new ArrayList<>();
        for (Customer customer : customers){
            customerDtos.add(toDto(customer));
        }
        return customerDtos;
    }
}
Enter fullscreen mode Exit fullscreen mode
@RestController
@AllArgsConstructor
@RequestMapping("/customer")
public class CustomerController {

    private final CustomerService customerService;

    @GetMapping("/all")
    public List<CustomerDto> getAllCustomers(){
        return customerService.getAllCustomers();
    }

    @PostMapping("/add")
    public Customer addCustomer(@RequestBody CustomerDto customerDto){
        return customerService.addCustomer(customerDto);
    }

    @GetMapping("/{id}")
    public CustomerDto getById(@PathVariable("id") Long id){
        return customerService.getCustomerById(id);
    }

    @GetMapping("/criteria")
    public List<CustomerDto> getByCriteria(@RequestBody CustomerDto customerDto){
        return customerService.getCustomerByCriteria(customerDto);
    }
}
Enter fullscreen mode Exit fullscreen mode
// DataJpaTest for testing database interaction of Customer Repository
@DataJpaTest
public class CustomerRepositoryTest {

    @Autowired
    private CustomerRepository customerRepository;

    @Test
    void findOrdersByCustomerId(){
        Customer customer = new Customer();
        customer.setId(1L);
        customer.setFirstName("Harry");
        customer.setLastName("Reddington");
        customer.setEmail("hreddington@gmx.com");
        customer.setAge(39);

        Order o1 = new Order();
        o1.setId(1L);
        o1.setOrderDate("28-05-2025");
        o1.setAmount(10.0);
        o1.setCustomer(customer);

        Order o2 = new Order();
        o2.setId(2L);
        o2.setOrderDate("30-05-2025");
        o2.setAmount(20.0);
        o2.setCustomer(customer);

        customer.setOrderList(List.of(o1,o2));
        customerRepository.save(customer);

        List<Order> orders = customerRepository.findOrdersByCustomerId(customer.getId());
        assertEquals(2, orders.size());
    }
}
Enter fullscreen mode Exit fullscreen mode
// Unit test for Customer Service using Mockito
@ExtendWith(MockitoExtension.class)
public class CustomerServiceTest {

    @Mock
    private CustomerRepository customerRepository;
    private CustomerCriteriaRepository customerCriteriaRepository;

    @InjectMocks
    private CustomerService customerService;

    @Test
    void testGetAllCustomers() {
        List<Customer> customerList = List.of(
                new Customer(1L, "Sarah", "Miller", 28, "sarah@example.com", null),
                new Customer(2L, "Wentworth", "Burrows", 38, "wentworth@example.com", null)
        );

        when(customerRepository.findAll()).thenReturn(customerList);

        List<CustomerDto> result = customerService.getAllCustomers();
        assertEquals(2, result.size());
        assertEquals("Sarah", result.get(0).firstName());
    }

    @Test
    void testAddCustomer() {
        Order order = new Order();
        CustomerDto dto = new CustomerDto(null, "Katy", "Pery", "katy@example.com", 30, List.of(order));

        Customer savedCustomer = new Customer(1L, "Katy", "Pery", 30, "katy@example.com", List.of(order));
        when(customerRepository.save(org.mockito.ArgumentMatchers.any(Customer.class))).thenReturn(savedCustomer);

        Customer result = customerService.addCustomer(dto);

        assertEquals("Katy", result.getFirstName());
    }

    @Test
    void testGetCustomerById() {
        Customer customer = new Customer(1L, "John", "Johnson", 40, "john@example.com", null);
        when(customerRepository.findById(1L)).thenReturn(java.util.Optional.of(customer));

        CustomerDto dto = customerService.getCustomerById(1L);

        assertEquals("John", dto.firstName());
        assertEquals("Johnson", dto.lastName());
        assertEquals(40, dto.age());
        assertEquals(null, dto.email());
    }

    @Test
    void testGetCustomerByCriteria() {
        Customer customer = new Customer(1L, "Sara", "Miller", 25, "sara@example.com", null);
        when(customerCriteriaRepository.getCustomerByCriteria(org.mockito.ArgumentMatchers.any()))
                .thenReturn(List.of(customer));

        CustomerDto criteria = new CustomerDto(null, "Sara", "Miller", "sara@example.com", 25, null);
        List<CustomerDto> result = customerService.getCustomerByCriteria(criteria);

        assertEquals(1, result.size());
    }
}
Enter fullscreen mode Exit fullscreen mode
// WebMvcTest for testing Customer Controller REST endpoints
@WebMvcTest(controllers = CustomerController.class)
@AutoConfigureMockMvc(addFilters = false)
public class CustomerControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private CustomerService customerService;

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    void getAllCustomers() throws Exception{
        CustomerDto customerDto1 = new CustomerDto(1L, "Tibor", "Focu", null, 45, null);
        CustomerDto customerDto2 = new CustomerDto(2L, "Lady", "Gaga", null, 43, null);

        List<CustomerDto> customerDtoList = Arrays.asList(customerDto1, customerDto2);

        when(customerService.getAllCustomers()).thenReturn(customerDtoList);

        ResultActions result = mockMvc.perform(get("/customer")
                .contentType(MediaType.APPLICATION_JSON));

        result.andExpect(status().isOk())
                .andExpect(jsonPath("$[0].firstName", CoreMatchers.is("Tibor")))
                .andExpect(jsonPath("$[1].firstName", CoreMatchers.is("Lady")));
    }
}
Enter fullscreen mode Exit fullscreen mode
// Custom repository for dynamic customer queries using JPA Criteria API
@Repository
public class CustomerCriteriaRepository {

    @Autowired
    private EntityManager entityManager;

    public List<Customer> getCustomerByCriteria(Customer customer){
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Customer> query = cb.createQuery(Customer.class);
        Root<Customer> root = query.from(Customer.class);

        Predicate firstNamePredicate = cb.like(root.get("firstName"), customer.getFirstName());
        Predicate lastNamePredicate = cb.like(root.get("lastName"), customer.getLastName());
        Predicate agePredicate = cb.equal(root.get("age"), customer.getAge());

        Predicate firstNameAndAge = cb.and(firstNamePredicate, agePredicate);
        Predicate lastNameAndAge = cb.and(lastNamePredicate, agePredicate);
        Predicate orPredicate = cb.or(firstNameAndAge, lastNameAndAge);

        query.where(orPredicate);
        return entityManager.createQuery(query).getResultList();
    }
}

Enter fullscreen mode Exit fullscreen mode
// Simple client for sending tasks to a server via socket
public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 1234);
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("To-Do client started. Type tasks, 'list' to view all, or 'exit' to quit.");

        String userInput;
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            String response;
            while ((response = in.readLine()) != null) {
                if (response.equals("END")) break;
                System.out.println("Server: " + response);
                if (!userInput.equalsIgnoreCase("list")) break;
            }
            if (userInput.equalsIgnoreCase("exit")) break;
        }

        socket.close();
    }
}
Enter fullscreen mode Exit fullscreen mode
// Simple server for managing a to-do list via socket
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(1234);
        System.out.println("Server running...");

        List<String> todoList = new ArrayList<>();

        Socket clientSocket = serverSocket.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            if (inputLine.equalsIgnoreCase("exit")) {
                out.println("Closing connection.");
                break;
            } else if (inputLine.equalsIgnoreCase("list")) {
                out.println("To-Do List:");
                for (int i = 0; i < todoList.size(); i++) {
                    out.println((i + 1) + ". " + todoList.get(i));
                }
                out.println("END");
            } else {
                todoList.add(inputLine);
                out.println("Task added: " + inputLine);
            }
        }

        clientSocket.close();
        serverSocket.close();
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)