Best Practice Feedback zu Service / JUnit Tests

687b46c0da97

Mitglied
Aloha zusammen,
ich versuche mich gerade an neuen Frameworks (Spring Boot & JUnit). Soweit funktioniert alles und wie immer gibt es auch die ein oder andere Straße nach Rom, weswegen ich gerne einmal Feedback sammeln würde in Bezug auf meine Tests/Implementierung.

Prinzipiell habe ich folgende Architektur im Kopf:


JpaRepository <-- ENTITY --> Service(Impl) <-- DTO/ENTITY --> Frontend/Controller/...

Nun ein Beispiel meines Codes. Prinzipiell sollen in der App verschiedene User, welcher innerhalb einer Company zusammenarbeiten können Ihre Inventur (über Produkte) machen können. Späße wie ACL wollte ich im Frontend machen (z.B. User versucht ein produkt anzulegen für eine andere Company zu welcher er nicht zugehörig ist etc).

Meine Service Klasse:
Java:
@Service
@Transactional
public class ProductService implements IProductService {

    @Autowired
    private ProductRepository productRepository;

    @Autowired
    private ICompanyService companyService;
  
    @Override
    public Page<Product> getProducts(Company company, Pageable pageable) {
        return productRepository.findAllByCompany(company, pageable);
    }

    @Override
    public Product createNewProduct(ProductDto dto) throws Exception {
        Product p = new Product();
        p.setName(dto.getName());
        p.setGtin(dto.getGtin());
        p.setArticleNumber(dto.getArticleNumber());
        p.setCompany(companyService.findById(dto.getCompanyId()).orElseThrow(Exception::new)); //TODO: proper Exception
        p.setPrice(dto.getPrice());
        p.setPurchasingPrice(dto.getPurchasingPrice());

        return productRepository.save(p);
    }
}
Meine Service Test Klasse:
Java:
@DataJpaTest
@ExtendWith(MockitoExtension.class)
class ProductServiceTest {

    @InjectMocks
    private ProductService productService;

    @Mock
    private ProductRepository productRepository;

    @Mock
    private CompanyService companyService;

    private Company company;
    private User user;

    @BeforeEach
    void setup() {
        user = new User();
        user.setEmail("hope@junit-test.de");
        user.setFirstName("Hope");
        user.setLastName("Mikaelson");
        user.setPassword("1234567");

        company = new Company();
        company.setName("BlackRock");
        company.setUser(user);
    }


    @test
    void getProductsForCompanyWhenNoProductsExist() {
        Pageable p = PageRequest.of(0, 5);

        when(productRepository.findAllByCompany(company, p))
                .thenReturn(new PageImpl<>(new ArrayList<>(), p, 0));

        Page<Product> products = productService.getProducts(company, p);

        assertEquals(0, products.getTotalElements());
    }

    @test
    void getProductsForCompany() {
        Pageable p = PageRequest.of(0, 5);
        List<Product> productList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Product product = new Product();
            product.setCompany(company);
            product.setName(String.valueOf(i));
            product.setArticleNumber("P" + i);
            product.setPrice(new BigDecimal("1.99"));
            productList.add(product);
        }

        when(productRepository.findAllByCompany(company, p))
                .thenReturn(new PageImpl<>(productList, p, productList.size()));

        Page<Product> products = productService.getProducts(company, p);

        assertEquals(10, products.getTotalElements());
        assertEquals(2, products.getTotalPages());
        assertEquals(5, products.getSize());
    }

    @test
    void createNewProduct() throws Exception {
        UUID companyUuid = UUID.randomUUID();
        ProductDto dto = new ProductDto();
        dto.setName("MacBook Air M1 2022");
        dto.setPrice(new BigDecimal("1337"));
        dto.setArticleNumber("APL-MBA-M1-22");
        dto.setCompanyId(companyUuid);

        when(companyService.findById(companyUuid)).thenReturn(Optional.ofNullable(company));

        productService.createNewProduct(dto);

        verify(productRepository, times(1)).save(Mockito.any(Product.class));
    }
}

Meine Fragen:
  • Macht die Test implementierung so Sinn? Gäbe es optimierungsbedarf?
  • Macht es in Spring Boot Sinn Tests für die JPARepository Klassen zu schreiben (für die "custom methoden")?
  • Macht der Frontend mix aus DTO/Entity Sinn? Oder sollte der Service Layer nach vorne bereits alles in DTOs übersetzen?
  • Verbesserungsvorschläge?
 

687b46c0da97

Mitglied
Das klingt für mich komisch. Wenn jemand die API direkt verwendet umgeht er die ACL damit.
Hi! Danke für deinen Einwand, sehr guter Punkt.

Ich habe das einmal umgeschrieben alà
Java:
@Override
public Product createNewProduct(User user, ProductDto dto) {
    if(!user.getCompany().getId().equals(dto.getCompanyId())) {
        throw new AccessDeniedException("Can't create product on company that doesn't belong to user");
    }

    Product p = new Product();
    p.setName(dto.getName());
    p.setGtin(dto.getGtin());
    p.setArticleNumber(dto.getArticleNumber());
    p.setCompany(user.getCompany());
    p.setPrice(dto.getPrice());
    p.setPurchasingPrice(dto.getPurchasingPrice());

    return productRepository.save(p);
}

Macht das Sinn das so zu machen? Generell denke ich, dass ich noch Probleme habe genau zu wissen wann/wo die Beziehungen der objekte aufgesetzt/mantained werden sollen. Falls du andere Beispiele hast (GitHub repos - je komplexer desto besser :D) oder Präferenzen, lass es mich gerne wissen.
 

Oneixee5

Top Contributor
Die Prüfung ist sehr einfach, wenn dir das so ausreicht ist es OK. Ich würde etwas bevorzugen, was ich nicht überall separat einbauen muss. Ich will mir nicht jedes mal Gedanken machen müssen, ob etwas falsch oder richtig ist. Ich schreibe z.B.: Annotations zum Validieren, die Annotations setze ich dann im Controller an den Prarameter z.B. ProductDto, dann erfolgt die Prüfung immer bei Übergabe und ich habe im Zwiefelsfall nur eine Stelle zu ändern.

Ich bevorzuge auch weniger Code: https://www.appsdeveloperblog.com/dto-to-entity-and-entity-to-dto-conversion/
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Vivien Bitte um Optimierungsvorschläge / Verbesserungsvorschläge / allgemeines Feedback Java Basics - Anfänger-Themen 8
J Erste Schritte Feedback zum ersten Anfängerprogramm Java Basics - Anfänger-Themen 6
Spencer Reid Feedback zu kleinem Spiel Java Basics - Anfänger-Themen 4
T Erste Schritte Feedback erwünscht Java Basics - Anfänger-Themen 2
A Feedback zum Spiel Java Basics - Anfänger-Themen 5
C Bitte kurzes Feedback - JavaVersionen Java Basics - Anfänger-Themen 6
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
izoards Prunsrv - Windows Service - .bat file starten Java Basics - Anfänger-Themen 84
I Kommunikation "normaler PC" mit lokaler Software an "Cloud Service" und umgekehrt Java Basics - Anfänger-Themen 15
H Service/Task updateProgress Java Basics - Anfänger-Themen 36
S Mit Cloud Messaging Service starten Java Basics - Anfänger-Themen 2
S Android Service ferngesteuert starten Java Basics - Anfänger-Themen 5
T Windows service erstellen Java Basics - Anfänger-Themen 1
B Windows Service erstellen Java Basics - Anfänger-Themen 2
B Print Service Java Basics - Anfänger-Themen 5
J XML-Strukturen für REST-Service erstellen Java Basics - Anfänger-Themen 1
O Watch Service erkennt Datei Änderung nicht Java Basics - Anfänger-Themen 0
I AWS Event Notification Service Sample ausführen... Java Basics - Anfänger-Themen 7
G HttpUnit 503 Service Unavailabl Java Basics - Anfänger-Themen 2
C Servlets: doPost() etc. anstatt service() Java Basics - Anfänger-Themen 4
W junit.Test not accessible? Java Basics - Anfänger-Themen 4
M Anfängerfehler - Tests JUnit IntelliJ Java Basics - Anfänger-Themen 24
D Cannot find JUnit.framework Java Basics - Anfänger-Themen 1
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
U JUnit testen auf SomeException Java Basics - Anfänger-Themen 5
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
A JUnit testing is inkonsistent Java Basics - Anfänger-Themen 12
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
A Test Junit Java Basics - Anfänger-Themen 1
H Junit test Java Basics - Anfänger-Themen 12
P Methoden JUnit 4 - Test Java Basics - Anfänger-Themen 6
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
Y Wie kann ich Konsoleneingaben durch den Scanner mit JUnit 4 testen? Java Basics - Anfänger-Themen 1
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
N Fehler bei JUnit Test Java Basics - Anfänger-Themen 5
W JUnit Tests Java Basics - Anfänger-Themen 4
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
B JUnit / Exceptions/ try-catch Java Basics - Anfänger-Themen 6
L JUnit tests in java Java Basics - Anfänger-Themen 5
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
F JUnit - Was ist mit "side effects" gemeint ? Java Basics - Anfänger-Themen 2
H JUnit in Eclipse: java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 9
B JUnit Test erstellen Java Basics - Anfänger-Themen 6
W Problem bei JUnit Test Aufgabe Java Basics - Anfänger-Themen 15
L Junit Testing bei XML? Java Basics - Anfänger-Themen 3
J LocalDateTime testen mit Junit Java Basics - Anfänger-Themen 20
W JUnit Test und HashCode Java Basics - Anfänger-Themen 14
A Objekt in Methode zurückgeben, JUnit zeigt Error Java Basics - Anfänger-Themen 2
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
O JUnit - Objektreferenzen Java Basics - Anfänger-Themen 3
G Testen mit JUnit Java Basics - Anfänger-Themen 4
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
C JUnit Tests. How to Java Basics - Anfänger-Themen 5
S Junit Test Java Basics - Anfänger-Themen 2
shiroX Klassen Klasse/Methode private final jUnit-Fehler Java Basics - Anfänger-Themen 5
L Junit Tests Java Basics - Anfänger-Themen 10
A IllegalArgumentException in JUnit testen Java Basics - Anfänger-Themen 3
V ToString-Methode mit JUnit testen(BlueJ) Java Basics - Anfänger-Themen 10
shiroX Methoden JUnit-Test einer void-Methode Java Basics - Anfänger-Themen 4
V JUnit Klassen Java Basics - Anfänger-Themen 3
T Junit Mockito: Instanz von inneren erzeugten Objekten Java Basics - Anfänger-Themen 4
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
S Kommt es zu Seiteneffekten wenn man waehrend den laufenden JUnit Tests den Code aendert? Java Basics - Anfänger-Themen 2
M JUnit Testmethoden mit mehreren assert Methoden Java Basics - Anfänger-Themen 1
S Double und Gleitkommazahlen mit JUnit testen Java Basics - Anfänger-Themen 7
K JUnit: Objekte von eigenen Klassen vergleichen...geht nicht Java Basics - Anfänger-Themen 5
Z JUnit Exception Java Basics - Anfänger-Themen 2
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
M Ist die Hamcrest Bibliothek auch schon in Junit 4.11 verfügbar? Java Basics - Anfänger-Themen 1
S Unterschied .jar Datei ausführen und junit Testfall... Java Basics - Anfänger-Themen 3
M Reihenfolge von Testmethoden in JUnit beeinflussen Java Basics - Anfänger-Themen 2
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
G JUnit-Tests im Programmdurchlauf starten Java Basics - Anfänger-Themen 4
T Best Practice JUnit: Wie Klassen durch Stubs/Mockups ersetzen Java Basics - Anfänger-Themen 7
T JUnit test failed Java Basics - Anfänger-Themen 3
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3
T Junit in Eclipse Java Basics - Anfänger-Themen 1
P JUnit bedeutungen Java Basics - Anfänger-Themen 3
R JUnit Test mit einer Dateistruktur als Testparameter Java Basics - Anfänger-Themen 3
shiroX OOP Array kleinste Zahl mit jUnit test Java Basics - Anfänger-Themen 3
S JUnit assertEquals funktioniert nichgt wie es sollte :( Java Basics - Anfänger-Themen 7
V Frage zu JUnit Tests Java Basics - Anfänger-Themen 3
B JUnit für JFileChooser Java Basics - Anfänger-Themen 6
S Code stimmt nicht für vorgegebenen JUnit-Test Java Basics - Anfänger-Themen 2
S File vergleich - Junit Java Basics - Anfänger-Themen 6
T JUnit Java Basics - Anfänger-Themen 18
G Junit Java Basics - Anfänger-Themen 4
X JUnit testing Java Basics - Anfänger-Themen 7
T JUnit Suite frage Java Basics - Anfänger-Themen 6
R JUnit Test mit mehrfach ausgeführt Java Basics - Anfänger-Themen 6
S InvocationTargetException bei JUnit Testlauf Java Basics - Anfänger-Themen 2
B JUnit - Mini-Test Java Basics - Anfänger-Themen 9
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
Y Junit Test - Testwert ändert sich Java Basics - Anfänger-Themen 12
T Junit --Exception testen Java Basics - Anfänger-Themen 15
A JUnit Tests in Jar-Archiv packen Java Basics - Anfänger-Themen 2
G Erste Schritte JUNIT Regressionstests automatisieren Java Basics - Anfänger-Themen 2
M JUnit - nur einzelne Methode testen? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben