2016-06-14 31 views
3

Ich implementiere eine Funktion, wo, wenn es eine Ausnahme beim Schreiben von Daten in die DB gibt, sollten wir es erneut versuchen für 5 mal vor dem Scheitern. Ich habe das Feature implementiert, kann es aber nicht mit dem Arquillian-Test testen.JBOSS Arquillian: Wie erzwinge die Datenbank, beim Ausführen des Aquillian-Tests eine Ausnahme auszulösen?

Wir verwenden JPA und Versant als Datenbank. Bis jetzt bin ich der Arquillian-Test und sobald mein Fluss DB-Handler-Code erreicht, stoppe ich die Datenbank. Aber das ist die schlechteste Art zu testen.

Haben Sie Vorschläge, wie Sie dasselbe erreichen können?

+0

Willst du fragen, wie man die Datenbank N mal versuchen bei Fehlerszenario mit JPA-Framework zu automatisieren? –

+0

'OLE' zu den möglichen Lösungen hinzugefügt. – Mark

Antwort

0

native Lösungen

Es ist der alte Trick von Null in der Datenbank geteilt wird. Zum Zeitpunkt der Auswahl könnten Sie versuchen:

select 1/0 from dual; 

Insertion Zeit (benötigen Sie eine Tabelle):

insert into test_table (test_number_field) values (1/0); 

reine JPA Lösung

Sie können versuchen, die @Version zu nutzen Annotation und Dekrement es zu werfen OptimisticLockException. Dies wird nicht in der Datenbank, sondern in der Java-Ebene ausgelöst, erfüllt aber Ihre Anforderungen.

All dies führt zum Ausfall der Datenbank.

+0

Der Typ verwendet JPA, Sie können keine Ad-hoc-Abfragen ausführen, Sie müssen Abfragen auf Klassen (Entitäten) abbilden. –

+0

Sie können es tun, siehe ** Native SQL-Abfragen verwenden **: http://www.oracle.com/technetwork/articles/vasiliev-jpql-087123.html – Mark

+0

Natürlich denke ich, er fragt, wie zu bekommen JPA-Code wirft Fehler in Runtime, und ja der Weg ist native Abfragen, wie ich in meiner Antwort vorgeschlagen. –

0

Mit JPA ist der einfachste Weg, Ihrer Datenzugriffsebene eine Methode hinzuzufügen, mit der Sie native Abfragen ausführen können. Dann führen Sie eine Abfrage gegen nicht existierende Tabelle oder etwas Ähnliches aus. Also in meinem DAO-Dienstprogramme fand ich Methode wie folgt:

public List findByNativeQuery(String nativeQuery, Map<String, Object> args) { 

    try{ 

     final EntityManager em = getEntityManager(); 
     final Query query = em.createNativeQuery(nativeQuery); 

     if (args!=null && args.entrySet().size()>0) { 
      final Iterator it = args.entrySet().iterator(); 
      while (it.hasNext()) { 
       final Map.Entry pairs = (Map.Entry)it.next(); 
       query.setParameter(pairs.getKey().toString(), pairs.getValue()); 
      } 
     } 

     return query.getResultList(); 

    } 
    catch (RuntimeException e) { 
     // throw some new Exception(e.getMessage()); // the best is to throw checked exception 
    } 

} 
+0

Ich muss dies in einem Integrationstest testen. Ich möchte meinen tatsächlichen Code nicht ändern (da dies das ist, was geliefert wird), aber ich möchte immer noch DB für einige Zeit nicht verfügbar machen, während mein Integrationstest ausgeführt wird. – sauumum

+0

Dann verwenden Sie inmemory-Datenbank für diesen Zweck. Starten Sie es mit Java-Code-Snippet. Jboss hat eine Datenbank nur für diesen Zweck. Sie deklarieren seine Ressourcen in src/test/resources. HQSql. –