Я работаю над приложением для Spring Boot Java, используя JPA, где у меня есть адресный базовый класс и плоский подкласс, представляющий квартиру. Я написал несколько тестов, используя TestResttemplate Spring Boot. Должен ли я использовать int или long вместо этого для идентификаторов, таких как Unitnumber и AddersID? /> домен: < /p>
package za.ac.shinysneakerz.domain;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Flat extends Address{
@Id
private short unitNumber;
private String flatName;
protected Flat() {
super();
}
private Flat(Builder builder) {
this.unitNumber = builder.unitNumber;
this.flatName = builder.flatName;
this.addressId = builder.addressId;
this.streetNumber = builder.streetNumber;
this.streetName = builder.streetName;
this.suburb = builder.suburb;
this.city = builder.city;
this.province = builder.province;
this.postalCode = builder.postalCode;
}
public short getUnitNumber() {
return unitNumber;
}
public String getFlatName() {
return flatName;
}
@Override
public String toString() {
return "Flat{" +
"flatName='" + flatName + '\'' +
", unitNumber=" + unitNumber +
'}';
}
public static class Builder{
private short unitNumber;
private String flatName;
private Long addressId;
private short streetNumber;
private String streetName;
private String suburb;
private String city;
private String province;
private short postalCode;
public Builder setUnitNumber ( short unitNumber){
this.unitNumber = unitNumber;
return this;
}
public Builder setFlatName (String flatName){
this.flatName = flatName;
return this;
}
public Builder setAddressId(Long addressId) {
this.addressId = addressId;
return this;
}
public Builder setSuburb(String suburb) {
this.suburb = suburb;
return this;
}
public Builder setCity(String city) {
this.city = city;
return this;
}
public Builder setPostalCode(short postalCode) {
this.postalCode = postalCode;
return this;
}
public Builder setProvince(String province) {
this.province = province;
return this;
}
public Builder setStreetName(String streetName) {
this.streetName = streetName;
return this;
}
public Builder setStreetNumber(short streetNumber) {
this.streetNumber = streetNumber;
return this;
}
public Builder copy(Flat flat){
this.unitNumber = flat.unitNumber;
this.flatName = flat.flatName;
this.addressId = flat.addressId;
this.streetNumber = flat.streetNumber;
this.streetName = flat.streetName;
this.suburb = flat.suburb;
this.city = flat.city;
this.province = flat.province;
this.postalCode = flat.postalCode;
return this;
}
public Flat build(){
return new Flat(this);
}
}
}
< /code>
factory: < /p>
package za.ac.shinysneakerz.factory;
import za.ac.shinysneakerz.domain.Flat;
import za.ac.shinysneakerz.util.Helper;
public class FlatFactory {
public static Flat createFlat(short unitNumber, String flatName, Long addressId, short streetNumber, String suburb, String city, String province, short postalCode) {
if(Helper.isNullOrEmpty(flatName)
|| Helper.isValidPostalCode(postalCode)
|| Helper.isValidStreetNumber(streetNumber)
|| Helper.isValidUnitNumber(unitNumber)){
return null;
}
return new Flat.Builder()
.setUnitNumber(unitNumber)
.setFlatName(flatName)
.setAddressId(addressId)
.setSuburb(suburb)
.setCity(city)
.setProvince(province)
.setPostalCode(postalCode)
.build();
}
}
< /code>
Repository: < /p>
package za.ac.shinysneakerz.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import za.ac.shinysneakerz.domain.Flat;
import java.util.Optional;
import java.util.Set;
@Repository
public interface FlatRepository extends JpaRepository {
Set getAll();
Optional findByFlatName(String flatName);
Optional findByStreetName(String streetName); //This are the address atts put them in flat too
//Optional findByStreetNumber(Long streetNumber); //This are the address atts put them in flat too
//Optional findByStreetNumber(long streetNumber);
}
< /code>
Flat Service: < /p>
package za.ac.shinysneakerz.service;
import za.ac.shinysneakerz.domain.Flat;
import java.util.Optional;
import java.util.Set;
public interface FlatService extends Service {
Set getAll();
Optional findByFlatName(String flatName);
Optional findByStreetName(String streetName);
}
< /code>
Реализация службы: < /p>
package za.ac.shinysneakerz.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import za.ac.shinysneakerz.domain.Flat;
import za.ac.shinysneakerz.repository.FlatRepository;
import java.util.Optional;
import java.util.Set;
@Service
public class FlatServiceImplementation implements FlatService {
// @Autowired
// private static FlatService service;
private FlatRepository repository;
@Autowired //Constructor injection
FlatServiceImplementation(FlatRepository repository) {
this.repository = repository;
}
@Override
public Set getAll() {
return this.repository.getAll();
//return this.repository.findAll();
}
@Override
public Optional findByFlatName(String flatName) {
return Optional.empty();
}
@Override
public Optional findByStreetName(String streetName) {
return Optional.empty();
}
@Override
public Flat create(Flat flat) {
return this.repository.save(flat);
}
@Override
public Flat read(Short id) {
return this.repository.findById(id).orElse(null);
}
@Override
public Flat update(Flat flat) {
return this.repository.save(flat);
}
@Override
public void delete(Short id) {
this.repository.deleteById(id);
}
}
< /code>
Интерфейс службы: < /p>
package za.ac.shinysneakerz.service;
public interface Service {
//T create(ID id); //Naidoo uses T's here
T create(T t);
T read(ID id);
T update(T t);
//void delete(T t); //Naidoo uses ID's here
void delete(ID id);
}
< /code>
Тест контроллера: < /p>
package za.ac.shinysneakerz.controller;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;
import za.ac.shinysneakerz.domain.Flat;
import za.ac.shinysneakerz.factory.FlatFactory;
import static org.junit.jupiter.api.Assertions.*;
//@SpringBootTest
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class FlatControllerTest {
private static Flat flat;
@Autowired
private TestRestTemplate restTemplate;
private static final String baseUrl = "http://localhost:8080/flat";
//private String baseUrl = "http://localhost:8080/flat";
@BeforeAll
public static void setUp() {
flat = FlatFactory.createFlat((short) 23, "Blake", 123456L, (short) 23, "Bold", "Cape", "Some",(short) 45);
}
@Test
@Order(1)
void create() {
String url = baseUrl + "/create";
System.out.println("Post data: " + flat);
ResponseEntity postResponse = restTemplate.postForEntity(url, flat, Flat.class);
System.out.println("Save data: " + flat);
assertNotNull(postResponse.getBody());;
}
@Test
@Order(2)
void read() {
String url = baseUrl + "/read" + flat.getUnitNumber();
System.out.println("URL: " + url);
ResponseEntity postResponse = restTemplate.getForEntity(url, Flat.class);
assertNotNull(postResponse.getBody());
}
@Test
@Order(3)
void update() {
Flat updated = new Flat.Builder().copy(flat).setFlatName("Bloke").build();
String url = baseUrl + "update";
System.out.println("Post data: " + updated);
ResponseEntity response = restTemplate.postForEntity(url, updated, Flat.class);
assertNotNull(response.getBody());
}
@Test
@Order(4)
void getAll() {
String url = baseUrl + "All";
System.out.println("URL: " + url);
}
@Test
@Order(5)
void delete() {
String url = baseUrl + "delete/" + flat.getUnitNumber();
System.out.println("URL: " + url);
restTemplate.delete(url);
}
}
< /code>
Фабричный тест: < /p>
package za.ac.shinysneakerz.factory;
import org.junit.jupiter.api.Test;
import za.ac.shinysneakerz.domain.Flat;
import static org.junit.jupiter.api.Assertions.*;
class FlatFactoryTest {
@Test
void createFlat() {
//Flat flat = FlatFactory.createFlat((short) 10, "Blake");
Flat flat = FlatFactory.createFlat((short) 23, "Blake", 123456L, (short) 23, "Bold", "Cape", "Some",(short) 45);
}
}
Service Test:
package za.ac.shinysneakerz.service;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import za.ac.shinysneakerz.domain.Flat;
import za.ac.shinysneakerz.factory.FlatFactory;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
@TestMethodOrder(MethodOrderer.MethodName.class)
class FlatServiceImplementationTest {
@Autowired
private FlatService service;
private Flat flat = FlatFactory.createFlat((short) 23, "Blake", 123456L, (short) 23, "Bold", "Cape", "Some",(short) 45);
// @Test
// void findByFlatName() {
// }
//
// @Test
// void findByStreetName() {
// }
@Test
void create() {
Flat created = service.create(flat);
assertNotNull(created);
System.out.println(created);
}
@Test
void read() {
Flat read = service.read(flat.getUnitNumber());
assertNotNull(read);
System.out.println(read);
}
@Test
void update() {
Flat newFlat = new Flat.Builder().copy(flat).setFlatName("Ryan").build();
Flat updated = service.update(newFlat);
assertNotNull(updated);
System.out.println(updated);
}
@Test
void getAll() {
System.out.println(service.getAll());
}
@Test
void delete() {
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... with-build