Notas de estudo de Java - problemas encontrados por TestNG + Spring

No teste de unidade, o bean precisa ser injetado para testar, mas um ponteiro nulo java.lang.NullPointerException é relatado.

Isso ocorre porque a classe não herda a classe AbstractTestNGSpringContextTests, resultando em nenhuma capacidade de injetar instâncias.

A função da classe AbstractTestNGSpringContextTests: a classe de teste tem a capacidade de injetar instâncias apenas se herdar essa classe.

@SpringBootTest
@Slf4j
public class TransferTest extends AbstractTestNGSpringContextTests {
    @Autowired
    public StudentService studentService;
    
    @Test
    public void testStudent(){
        log.info("测试用例开始执行");
        studentService.play();
        Student student=new Student();
        student.setName("小周");
        student.setAge(12);
        System.out.println(student.getAge());
    }
}

 

Então foi executado, mas o novo problema voltou

O problema é que o bean de StudentService não foi montado com sucesso. Eu não digo nada e as anotações foram adicionadas. Qual é o motivo? Baidu.

Eu encontrei a seguinte frase, entendo-a cuidadosamente (desenhar pontos-chave, deve ser testado!)

De acordo com o acima, é fácil de resolver, coloque o serviço e dao no pacote escaneável ou adicione o escopo do pacote de varredura após a anotação @SpringBootApplication, como o seguinte (ignorando a nomenclatura do nome do pacote)

@SpringBootApplication (scanBasePackages = {"com.test.dto"})

Execute novamente e funcionará perfeitamente.

 

@SpringBootTest

Em geral, depois de usar @SpringBootTest, o Spring carregará todos os beans gerenciados, o que é basicamente equivalente a iniciar o serviço inteiro, e você pode iniciar o teste funcional neste momento.

Inclui todos os beans importados na classe principal SpringBoot. Os beans na classe principal SpringBoot são os beans na classe @SpringBootApplication que você marcou

 

@MybatisTest 
@AutoConfigureTestDatabase (replace = AutoConfigureTestDatabase.Replace.NONE)

Use @MybatisTest, se você não adicionar a anotação @AutoConfigureTestDatabase (replace = AutoConfigureTestDatabase.Replace.NONE), então mybatis usa um banco de dados na memória, não um banco de dados tddl real, e relatará erros inexistentes

Na verdade, conforme mencionado acima, se você usar @SpringBootTest, todo o serviço será iniciado, o que é muito demorado. E se quisermos apenas testar uma determinada classe? Então use @MybatisTest

 

 

@ContextConfiguration

Se esta anotação tiver um arquivo de classe em (), o bean com o arquivo de classe será verificado primeiro, caso contrário, a classe com @Configuration será verificada e @SpringBootApplication será verificado por último

@ContextConfigurationEsta anotação é geralmente @RunWith(SpringJUnit4ClassRunner.class)usada em conjunto com o teste

Quando uma classe é anotada @Component, ela se torna automaticamente um bean e não há necessidade da configuração mostrada no arquivo de configuração do Spring. Normalmente, há duas maneiras de coletar esses beans, a maneira Java e a maneira XML. Depois que esses beans são coletados, quando queremos usar @Autowiredanotações para introduzir esses beans coletados em uma determinada classe de teste , precisamos apenas adicionar @ContextConfigurationanotações a esta classe de teste para marcar certos beans que desejamos importar esta classe de teste.

Você pode consultar este link: https://www.cnblogs.com/bihanghang/p/10023759.html

Acho que você gosta

Origin blog.csdn.net/mumuwang1234/article/details/112287894
Recomendado
Clasificación