una - testing en java
El resorte no se enciende automáticamente en las pruebas unitarias con JUnit (4)
Agrega algo como esto a tu clase de prueba de unidad raíz:
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration
Esto usará el XML en su ruta predeterminada. Si necesita especificar una ruta no predeterminada, puede proporcionar una propiedad de ubicación a la anotación ContextConfiguration.
http://static.springsource.org/spring/docs/2.5.6/reference/testing.html
Pruebo el siguiente DAO con JUnit:
@Repository
public class MyDao {
@Autowired
private SessionFactory sessionFactory;
// Other stuff here
}
Como puede ver, sessionFactory se conecta automáticamente con Spring. Cuando ejecuto la prueba, sessionFactory permanece nulo y obtengo una excepción de puntero nulo.
Esta es la configuración de sessionFactory en Spring:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
Que pasa ¿Cómo puedo habilitar el cableado automático para las pruebas unitarias también?
Actualización: no sé si es la única forma de ejecutar pruebas JUnit, pero tenga en cuenta que lo estoy ejecutando en Eclipse haciendo clic derecho en el archivo de prueba y seleccionando "ejecutar como" -> "Prueba JUnit"
Debe usar el corredor Spring JUnit para conectar los beans Spring desde su contexto. El código a continuación asume que tiene un contexto de aplicación llamado testContest.xml
disponible en la ruta de testContest.xml
de prueba.
import org.hibernate.SessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import java.sql.SQLException;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.startsWith;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:**/testContext.xml"})
@Transactional
public class someDaoTest {
@Autowired
protected SessionFactory sessionFactory;
@Test
public void testDBSourceIsCorrect() throws SQLException {
String databaseProductName = sessionFactory.getCurrentSession()
.connection()
.getMetaData()
.getDatabaseProductName();
assertThat("Test container is pointing at the wrong DB.", databaseProductName, startsWith("HSQL"));
}
}
Nota: Esto funciona con Spring 2.5.2 y Hibernate 3.6.5.
Falta la ubicación del archivo de contexto en la configuración puede causar esto, un enfoque para resolver esto:
- Especificando la ubicación del archivo de contexto en ContextConfiguration
me gusta:
@ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" })
Más detalles
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" })
public class UserServiceTest extends AbstractJUnit4SpringContextTests {}
Referencia: Gracias a @Xstian
Necesitas agregar anotaciones a la clase Junit, diciéndole que use SpringJunitRunner. Los que quieres son:
@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
Esto le dice a Junit que use el archivo test-context.xml en el mismo directorio que su prueba. Este archivo debería ser similar al contexto.xml real que está usando para Spring, pero apuntando a los recursos de prueba, naturalmente.