【问题标题】:How to test this code in junit 4 and java 8?如何在junit 4和java 8中测试这段代码?
【发布时间】:2022-02-04 12:33:43
【问题描述】:

我正在尝试在 junit 4 和 java 8 中测试此代码(我无法改进版本)。

问题是,我不能在这个版本中使用@MockBean 或@Autowired 进行测试编码,所以,¿如果我不能改进版本,有什么更好的选择?

代码:

public class DaoHibernate extends BaseDaoHibernate implements Dao {

private static final String ID_CD_QUERY_PARAM = "idCD";
private static final String IDPAIS_QUERY_PARAM = "idPais";
/**
 * Instancia del logger
 */
private static final Logger LOGGER = LoggerFactory.getLogger(DaoHibernate.class);
private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyyMMddHHmmss");



public List<Combo> getThingsByCamion (Integer idCD, Date fDesde,Date fHasta, Integer idPais,String idReferenciaTransporte){
    try {
        List<Combo> things = new ArrayList<Combo>();

        if (idCD != null) {

            final StringBuilder hqlQueryThings = new StringBuilder();

            hqlQueryThings.append("SELECT DISTINCT ");
            hqlQueryThings.append(" ao.referencia ");
            hqlQueryThings.append(" FROM ");
            hqlQueryThings.append(" almacen.agrupacion_operativa ao, ");
            hqlQueryThings.append(" almacen.Detalle_Agrupacion_Operativa dao, ");
            hqlQueryThings.append(" almacen.detalle_envio_exportacion dee, ");
            hqlQueryThings.append(" almacen.seguimiento_bulto sb ");

            if(idPais!=null ){
                hqlQueryPallet.append(" INNER JOIN MAESTROS.LOCALIZACION LOC ON LOC.ID_LOCALIZACION = sb.id_localizacion_destino ")
                .append(" AND LOC.ID_PAIS = :idPais ");
            }

            hqlQueryThings.append(" WHERE ");
            hqlQueryThings.append(" ao.id_agrupacion_operativa = dao.id_agrupacion_operativa AND ");
            hqlQueryThings.append(" sb.id_localizacion_origen = :idCD AND ");
            hqlQueryThings.append(" dee.id_bulto = dao.id_bulto  ");

            if(idReferenciaTransporte!=null ){
                hqlQueryPallet.append("  AND dee.referencia_transporte = :idReferenciaTransporte ");
            }
            if(fDesde!=null && fHasta!=null){
                hqlQueryThings.append("  AND SB.Fecha_Expedicion >= :fDesde AND ");
                hqlQueryThings.append("  SB.Fecha_Expedicion <= :fHasta ");
            }

            hqlQueryThings.append(" WITH UR ");
            final Query queryThing = getHibernateTemplate().getSessionFactory().getCurrentSession()
            .createSQLQuery(hqlQueryPallet.toString());
            if (idPais != null) {
                queryThing.setInteger(IDPAIS_QUERY_PARAM, idPais);
            }
            if (idReferenciaTransporte != null) {
                queryThing.setString("idReferenciaTransporte", idReferenciaTransporte);
            }
            queryThing.setInteger(ID_CD_QUERY_PARAM, idCD);
            queryThing.setDate("fDesde", fDesde);
            queryThing.setDate("fHasta", fHasta);

            final List<String> result = (List<String>) queryThing.list();

            if (result != null) {

                for(String obj : result){
                    Combos c = new Combos();
                    c.setKey(obj);
                    c.setValue(obj);

                    pallets.add(c);
                }
            }
        }
        LOGGER.debug("Fin getThingsByCamion");
        return pallets;
    } catch (final RuntimeException recep) {
        LOGGER.error("Errorejecutando getThings", recep);
        throw recep;
    }
}

当我到达最终查询时 queryThing = getHibernateTemplate().getSessionFactory().getCurrentSession() .createSQLQuery(hqlQueryPallet.toString());它只是说 NullPointerException 因为它在测试中找不到当前会话。

测试:

public class DaoHibernateTests {

private static final String ORIGEN = "Origen";
private static final String MATRICULA = "Matricula";
private static final String CODIGO_ENVIO = "Envio";

private static final String PLATAFORMA = "Plataforma 1";
private static final Integer ID_PLATAFORMA = 1;

/** The sdf. */
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");

private DaoHibernate daoHibernate;
private Date fechaEnvio;

@Before
public void setUp() throws ParseException {

    fechaEnvio = sdf.parse("01-01-2021");

    daoHibernate = new AgrupacionOperativaDaoHibernate();
}

@Test(expected = NullPointerException.class)
public void buscarMercanciaEntradaTestError1() {
    List<Combo> getThingsByCamion = daoHibernate.getThingsByCamion(1, fechaEnvio,fechaEnvio, 1,CODIGO_ENVIO);

    Assert.assertEquals(1, getThingsByCamion.size());
}

POM:用于测试的依赖项:

<java.version>1.8</java.version>
    <junit.version>4.4</junit.version>    

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-junit-jupiter</artifactId>
        <version>3.1.0</version>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>3.1.0</version>
        <type>pom</type>
    </dependency>

我需要做什么?

谢谢!

【问题讨论】:

    标签: java hibernate junit java-8 junit4


    【解决方案1】:

    您已经在使用 Java 8,所以这不是不使用 JUnit 5 的理由。这意味着您可以同时使用 JUnit 5 和 JUnit 4 的功能和包。通过使用 JUnit 5 依赖项(我建议使用 junit-jupiter 而不是 junit-jupiter-api,因为前者带有 junit-jupiter-enginejunit-jupiter-params)以及老式引擎(junit-vintage-engine)来做到这一点。

    这使您可以继续使用 JUnit 4(实际上是老式引擎)进行所有现有测试,并使用 JUnit 5 进行这个新测试。

    【讨论】:

    • 所以你的意思是将junit版本保留在4.4,但使用你告诉我最新的那些依赖项,对吗?因为,我可以,但是在这个项目中它不会让我更改 4.4 junit 版本
    • 不,我的意思是用junit-jupiterjunit-vintage-engine 替换当前的JUnit 4.4 依赖项。后者应该确保您现有的测试仍然有效。但是,如果您甚至不允许更改 4.4 版本,那当然是行不通的。你能告诉我们为什么你必须使用这个确切的版本吗?
    • 我必须使用它,因为项目,我的意思是,它是一个古老的 java 项目,他们不使用最新的,因为如果新版本破坏了服务。我更熟悉junit 5,并使用@Mockbean 或when().thenReturn,但我不能这样做,因为它找不到类。我问你,4.4你说去掉这个,把vintage和jupitar放到最新的对吧?
    • 这就是我至少会尝试的。它不应该破坏您现有的测试,因为老式引擎应该与 JUnit 4 完全一样。
    • 好吧,我试了一下,但我认为 @MockBean 它只适用于 @RunWith(SpringRunner.class) 如我所见,如果我使用 MockitoJUnitRunner 它说升级到junit 4.5
    猜你喜欢
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多