簡體   English   中英

Mocktio是否可以模擬持久性提供程序,以便jenkins(或其他管道工具)可以在沒有數據庫的情況下執行JUnit測試?

[英]Can Mocktio mock a persistence provider, so that jenkins (or other pipeline tools) can execute JUnit tests without a database?

因此,我為直接使用DAO的API編寫了JUnit測試,包括Mockito。 EntityManagerEntityTransaction沒有問題,並且測試在持久性提供程序可以連接到數據庫的機器上運行良好。 (使用EclipseLink)

但是,也正在運行這些測試的Jenkins無法訪問所討論的數據庫。 每次詹金斯執行我得到的測試時:

No Persistence provider for EntityManager named XYZ

我確實知道發生這種情況是因為jenkins無法建立與數據庫的真正連接。 此行為是故意的,不應更改。

因此,我的問題是:是否可以模擬(使用Mockito?),或以其他方式偽造連接,以便可以使用偽造的EntityManagerFactory /持久性提供程序?

在沒有真實數據庫訪問的情況下測試封閉式API的一種方法是構建並填充和拆除內存數據庫以進行測試。 使用Spring&Derby for Eclipselink進行簡單的設置是

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.transaction.TransactionConfiguration;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;

@ContextConfiguration(classes = AppConfig.class)
@TransactionConfiguration(defaultRollback = false)
public abstract class AbstractContainer {

@PersistenceUnit(unitName = "PERSISTENT_UNIT_NAME")
protected EntityManagerFactory factory;

@Autowired
protected ApplicationContext applicationContext;

}

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter;
import java.util.Properties;
import javax.sql.DataSource;

@Configuration
public class AppConfig {

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em =
    new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPersistenceUnitName("PERSISTENT_UNIT_NAME");
em.setPackagesToScan(new String[] { "package.name.to.scan" });

JpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter();

em.setJpaVendorAdapter(vendorAdapter);
// here some additional properties for the PU
em.setJpaProperties(additionalProperties());

return em;
}

Properties additionalProperties() {
Properties properties = new Properties();

properties.setProperty("eclipselink.weaving", "false");
properties.setProperty("eclipselink.query-results-cache", "false");
properties.setProperty("eclipselink.cache.shared.default", "false");

properties.setProperty("javax.persistence.jdbc.driver",
    "org.apache.derby.jdbc.EmbeddedDriver");
properties.setProperty("javax.persistence.jdbc.url",
    "jdbc:derby:memory:NAME;create=true");

properties.setProperty("javax.persistence.jdbc.url", "jdbc:derby:PATH");
properties.setProperty("javax.persistence.jdbc.user", "");
properties.setProperty("javax.persistence.jdbc.password", "");

properties.setProperty("javax.persistence.sql-load-script-source",
    "META-INF/sql/createDB.sql");
properties.setProperty("eclipselink.deploy-on-startup", "true");
properties.setProperty("eclipselink.target-database", "Derby");

return properties;
}

public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
try {
  Class.forName("org.eclipse.persistence.jpa.PersistenceProvider");
  Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
} catch (ClassNotFoundException cnfe) {
  cnfe.printStackTrace();
} catch (InstantiationException inste) {
  inste.printStackTrace();
} catch (IllegalAccessException iace) {
  iace.printStackTrace();
}

dataSource.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver");
dataSource.setUrl("jdbc:derby:memory:NAME;create=true");

dataSource.setUsername("");
dataSource.setPassword("");

return dataSource;
}

}

SQL腳本位於test / resources / META-INF / sql / createDB.sql下
最后,您的測試類使用SpringJUnit4ClassRunner.class Runner擴展了Abstract Container,並開始了本地事務。

@RunWith(SpringJUnit4ClassRunner.class)
public class DAOTest extends AbstractContainer {

@Test
public void testDAO() {

EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
}
}

默認情況下, 測試的持久性單元在test / resources / META-INF /下是期望的。

使用Maven的依賴

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>[4.1.7.RELEASE]</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>[4.1.7.RELEASE]</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>[4.1.7.RELEASE]</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-mock</artifactId>
        <version>[2.0.8]</version>
        <scope>test</scope>
    </dependency>   
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>10.11.1.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>10.11.1.1</version>
        <scope>test</scope>
    </dependency>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM