Pergunta

O teste a seguir ilustra que este feijão de teste é inicializado duas vezes pela primavera. Espero que alguém possa me dizer por que é assim, pois deve ser apenas uma vez. Aqui está o teste:

import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {} )
public class TestAfterPropsSet implements InitializingBean {

private static final Logger logger = Logger.getLogger(TestAfterPropsSet.class);

@Test
public void test1() {
    logger.debug("Test1");
}

@Test
public void test2() {
    logger.debug("Test2");      
}

public void afterPropertiesSet() throws Exception {
    logger.debug("Bean Initialized");       
}
} // end class

Aqui está o arquivo Bean:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

E aqui está a saída:

2009-10-13 21:20:04,393 [TestAfterPropsSet.java 26] DEBUG - Bean Initialized
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 17] DEBUG - Test1
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 26] DEBUG - Bean Initialized
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 22] DEBUG - Test2
Foi útil?

Solução

Não é uma convenção de primavera. Você deve seguir as convenções JUNIT, ou seja, a inicialização ou desconstrução em toda a suíte deve ser feita em @beforeClass e @afterclass de acordo, ou você pode usar @Autowire e deixar a mola lidar com o escopo do objeto.

Uma nova suíte será construída para cada teste. Isso é mais aparente no Junit3, onde você teve que criar uma nova suíte usando um nome de teste especificado.

Dê uma olhada no Javadoc:

A anotação de teste diz a Junit que o método público vazio ao qual está anexado pode ser executado como um caso de teste. Para executar o método, o Junit primeiro constrói uma nova instância da classe e invoca o método anotado. Quaisquer exceções lançadas pelo teste serão relatadas pelo Junit como um fracasso. Se nenhuma exceção for lançada, supõe -se que o teste tenha sido bem -sucedido.

Seu caso de uso é um pouco intrigante, pois seu teste não está realmente fazendo nada e não há feijão, o que você faz referencia. Por padrão, os grãos de primavera são declarados com o atributo padrão scope = "singleton", então você realmente declarou um feijão, teria sido um singleton em cache. No entanto, isso não tem nada a ver com a execução do método.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top