+- api
| +- v1
| +- mapper
| | +- CategoryMapper
| +- model
| | +- CategoryDTO
+- bootstrap
+- controllers
| +- v1
+- domain
+- repositories
+- services
+- impl
+- CategoryServiceImpl
@Data
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
@Data
public class CategoryDTO {
private Long id;
private String name;
}
@Data
@AllArgsConstructor
public class CategoryListDTO {
List<CategoryDTO> categories;
}
@Mapper
public interface CategoryMapper {
CategoryMapper INSTANCE = Mappers.getMapper(CategoryMapper.class);
CategoryDTO categoryToCategoryDTO(Category category);
}
class CategoryMapperTest {
CategoryMapper categoryMapper = CategoryMapper.INSTANCE;
@BeforeEach
void setUp() {
}
@Test
void categoryToCategoryDTO() {
Category category = new Category();
category.setName("Joe");
category.setId(1L);
CategoryDTO categoryDTO = categoryMapper.categoryToCategoryDTO(category);
assertEquals(Long.valueOf(1L), categoryDTO.getId());
assertEquals("Joe", categoryDTO.getName());
}
}
public interface CategoryRepository extends JpaRepository<Category, Long> {
Category findByName(String name);
}
public interface CategoryService {
List<CategoryDTO> getAllCategories();
CategoryDTO getCategoryByName(String name);
}
@Service
public class CategoryServiceImpl implements CategoryService {
private final CategoryMapper cateoryMapper;
private final CategoryRepository categoryRepository;
public CategoryServiceImpl(CategoryRepository categoryRepository) {
this.cateoryMapper = CategoryMapper.INSTANCE;
this.categoryRepository = categoryRepository;
}
@Override
public List<CategoryDTO> getAllCategories() {
return categoryRepository.findAll()
.stream()
.map(cateoryMapper::categoryToCategoryDTO)
.collect(Collectors.toList());
}
@Override
public CategoryDTO getCategoryByName(String name) {
return cateoryMapper.categoryToCategoryDTO(categoryRepository.findByName(name));
}
}
class CategoryServiceTest {
public static final Long ID = 2L;
public static final String NAME = "Jimmy";
@Mock
CategoryRepository categoryRepository;
CategoryService categoryService;
@BeforeEach
void setUp() {
MockitoAnnotations.initMocks(this);
categoryService = new CategoryServiceImpl(categoryRepository);
}
@Test
void getAllCategories() {
List<Category> categories = Arrays.asList(new Category(), new Category(), new Category());
when(categoryRepository.findAll()).thenReturn(categories);
List<CategoryDTO> categoryDTOS = categoryService.getAllCategories();
assertEquals(3, categoryDTOS.size());
}
@Test
void getCategoryByName() {
Category category = new Category();
category.setId(ID);
category.setName(NAME);
when(categoryRepository.findByName(eq(NAME))).thenReturn(category);
CategoryDTO categoryDTO = categoryService.getCategoryByName(NAME);
assertEquals(ID, categoryDTO.getId());
assertEquals(NAME, categoryDTO.getName());
}
}
@Controller
@RequestMapping("/api/v1/categories")
public class CategoryController {
private final CategoryService categoryService;
public CategoryController(CategoryService categoryService) {
this.categoryService = categoryService;
}
@GetMapping
public ResponseEntity<CategoryListDTO> getAllCategories() {
return new ResponseEntity<CategoryListDTO>(new CategoryListDTO(categoryService.getAllCategories()), HttpStatus.OK);
}
@GetMapping("/{name}")
public ResponseEntity<CategoryDTO> getCategoryByName(@PathVariable String name) {
return new ResponseEntity<CategoryDTO>(categoryService.getCategoryByName(name), HttpStatus.OK);
}
}
class CategoryControllerTest {
public static final String NAME = "Jim";
@Mock
CategoryService categoryService;
@InjectMocks
CategoryController categoryController;
MockMvc mockMvc;
@BeforeEach
void setUp() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(categoryController).build();
}
@Test
void getAllCategories() throws Exception {
CategoryDTO category1 = new CategoryDTO();
category1.setId(1L);
category1.setName(NAME);
CategoryDTO category2 = new CategoryDTO();
category2.setId(2L);
category2.setName("Bob");
List<CategoryDTO> categories = Arrays.asList(category1, category2);
when(categoryService.getAllCategories()).thenReturn(categories);
mockMvc.perform(get("/api/v1/categories")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.categories", hasSize(2)));
}
@Test
void getCategoryByName() throws Exception {
CategoryDTO category1 = new CategoryDTO();
category1.setId(1L);
category1.setName(NAME);
when(categoryService.getCategoryByName(eq(NAME))).thenReturn(category1);
mockMvc.perform(get("/api/v1/categories/" + NAME)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name", equalTo(NAME)));
}
}