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
@ContextConfiguration
Esta 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 @Autowired
anotações para introduzir esses beans coletados em uma determinada classe de teste , precisamos apenas adicionar @ContextConfiguration
anotaçõ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