2017-12-21 5 views
1

Ich habe eine einfache API geladen Daten aus einer PostgreSQL Datenbank und einem einfachen CRUD-Service/Repository (alle Spring-Boot-basierte). Ich habe meine markiert erstellen/aktualisieren Methoden in der Dienstschicht als:So testen Sie Spring @Transactional timeout ordnungsgemäß

@Transactional(timeout=5) 
public void create(Entity x){ 
    ... 
    repository.save(x) 
} 

Wie kann ich testen (Integrationstests, übrigens) die Bedingung, unter der Timeout-Ausnahme wäre geworfen werden? Mein Repository ist eine Erweiterung von CrudRepository.

So etwas wie doTimeout(6000).when(repository).save(...)

+0

Sie müssen das Transaktionszeitlimit nicht testen. Es ist Teil des Spring-Systems, nicht Ihres Systems. – DwB

+0

@DwB Ich bin irgendwie Ihrer Meinung, aber OTOH Ich stimme allen in diesem Beitrag beschriebenen Aspekten zu: http://the-music-of-time.blogspot.com.br/2012/10/writing-unit-tests- zu-sicherstellen-your.html. Ich denke gerne über die Verträge nach, die ich in meinen Methoden beschreibe, und das Entfernen würde das sehr verändern. – resilva87

Antwort

0

Sie sollten den Timeout-Wert parametrisieren und es durch ein Profil zur Verfügung stellen, setzen Sie es dann auf Ihren Testwert in Ihren Integrationstests. Dadurch können Sie Produktionswerte in Ihrem Produktionsprofil haben und Werte in Ihrem Testprofil testen.

Zum Beispiel in einem Profil namens application-test.yaml haben einen Eintrag:

postgres.config: 
    timeout: 10 

Dann timeout=5 mit "${postgres.config.10:20}" ersetzen. Die 20 gibt einen Standardwert an, wenn die Anwendung ohne ein bestimmtes Profil gestartet wird.

Verwandte Themen