Injeção de dependência da mola com testng
Pergunta
Spring Support Junit muito bem nisso: com o RunWith
e ContextConfiguration
anotação, as coisas parecem muito intuitivas
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:dao-context.xml")
Este teste poderá ser executado tanto no Eclipse e Maven no momento. Gostaria de saber se há coisas semelhantes para testng. Estou pensando em mudar para essa estrutura de "próxima geração", mas não encontrei uma correspondência para testar com a primavera.
Solução
Funciona com o teste também. Sua teste A aula precisa ampliar Uma das seguintes aulas:
Outras dicas
Aqui está um exemplo que funcionou para mim:
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
@Test
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TestValidation extends AbstractTestNGSpringContextTests {
public void testNullParamValidation() {
// Testing code goes here!
}
}
A primavera e o teste funcionam bem juntos, mas há algumas coisas a serem conscientes. Além da subclasse de abstratoTestngspringContextTests, você precisa estar ciente de como ele interage com as anotações de configuração/desmontagem de teste padrão.
Testng tem quatro níveis de configuração
- Beforesuite
- Beforetestest
- Antes da aula
- Beforemethod
que ocorrem exatamente como seria de esperar (ótimo exemplo de APIs de autocumentos). Tudo isso tem um valor opcional chamado "dependsonMethods", que pode pegar uma string ou string [], que é o nome ou o nome dos métodos no mesmo nível.
A classe AbstractTestngsPringContextTests possui um método anotado com o BeforeClass chamado SpringtestContextPrepareTestInstance, do qual você deve definir seu método de configuração para depender se estiver usando uma classe automática. Para métodos, você não precisa se preocupar com a sessão automática, pois ocorre quando a classe de teste é configurada nisso antes do método da classe.
Isso apenas deixa a questão de como você pode usar uma classe de retenção automática em um método anotado com Beforesuite. Você pode fazer isso chamando manualmente o SpringtestContextPrepareTestInstance - embora não seja configurado por padrão para fazer isso, já o fiz várias vezes com sucesso.
Então, para ilustrar, uma versão modificada do exemplo de Arup:
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
@Test
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TestValidation extends AbstractTestNGSpringContextTests {
@Autowired
private IAutowiredService autowiredService;
@BeforeClass(dependsOnMethods={"springTestContextPrepareTestInstance"})
public void setupParamValidation(){
// Test class setup code with autowired classes goes here
}
@Test
public void testNullParamValidation() {
// Testing code goes here!
}
}