Wie kann ich den Einsatz von Federtestcontext Framework mehrere Datenquellen zu machen?
-
09-10-2019 - |
Frage
Ich versuche, Integrationstest meine Anwendung mit Frühlings-Testcontext Rahmen. Ich habe dies getan, indem AbstractTransactionalJUnit4SpringContextTests
erstreckt, wie üblich. Aber meine Anwendung verfügt über drei verschiedene Datenquellen (mit Namen wie xDataSource, yDataSource, zdataSource), så wenn ich versuche, den Test auszuführen, die autowiring der Datenquelle in AbstractTransactionalJUnit4SpringContextTests
wird nicht funktionieren, da es sucht nach einer Datenquelle mit autowire -von-Typ, findet aber drei, so dass er nicht weiß, was man wählen.
Gibt es eine Möglichkeit Frühling Testcontext Framework zu erhalten drei Datenquellen zu benutzen? Wenn ja; wie?
Lösung
OK, ich es herausgefunden. Die Antwort auf diese Frage ist zweifach. Zum einen wird erstreckt AbstractTransactionalJUnit4SpringContextTests
nicht funktionieren. Dies ist, weil es eine einzige Datenquelle für die Erstellung der SimpleJdbcTemplate
für die Überprüfung Zeug mit einfachen JDBC Abfragen im Test benötigt. Da ich diese Funktion nicht in diesem Test verwende ich extends AbstractTransactionalJUnit4SpringContextTests
mit der collowing Konfiguration ersetzen könnte:
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class
})
@Transactional
public class IntegrationTest {
...
}
Die Kombination dieser Anmerkungen gibt die gleiche Einstellung wie AbstractTransactionalJUnit4SpringContextTests
erstrecken.
Der zweite Teil wurde zu verstehen, da ich drei Datenquellen haben, ich brauche auch alle drei so von der gleichen PlatformTransactionManager
referenziert werden. Ich habe Transaktionen verteilt. Das ist unmöglich, mit einem DataSourceTransactionManager
, so dass ich ein JtaTransactionManager
verwenden musste.
Andere Tipps
Die AbstractTransactionalJUnit4SpringContextTests
Klasse wird auf eine einzige Datenquelle autowired nur den Komfort zu ermöglichen, eines injizierten JdbcTemplate
Objekt bereitstellt. Sie können die setDataSource(DataSource dataSource)
Methode von AbstractTransactionalJUnit4SpringContextTests
in Ihrer Testunterklasse außer Kraft setzen und die Datenquelle wie folgt verwenden angeben:
@Resource(name = "dataSource")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
Sie müssen nur den Namen der eine Datenquelle zur Verfügung zu stellen Frühling für die jdbcTemplate
Bequemlichkeit Methoden verwenden sollte. Wenn erstreckt AbstractTransactionalJUnit4SpringContextTests
bequemer ist als andere Verfahren, die oben erwähnt wurde, dann können Sie es zwingen, zu der Arbeit von nur einem Ihrer Datenquellen auswählen.
fand ich diese Details im Frühjahr Jira Ticket # SPR-4634 .
Sie können als primary="true"
in Ihrem xml einer der Datenquellen definieren, und es wird gewählt werden.
Wenn Sie alle threem benötigen, dann können Sie sich nicht auf autowiring - Verwendung ReflectionTestUtils
es in Ihren Tests manuell einstellen