Exceção de classe não encontrada ao executar o teste JUnit

117

Estou recebendo este erro ao executar o teste JUnit no Eclipse:

Class not found com.myproject.server.MyTest
java.lang.ClassNotFoundException: com.myproject.server.MyTest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.java:693)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.java:429)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

Tentei adicionar JUnitbiblioteca no caminho de classe, embora esteja usando o maven e a biblioteca JUnit esteja na dependência do POM.

Já tentei limpar o projeto e criei um novo caso de teste JUnit usando o plug-in JUnit para Eclipse, ainda obtendo o mesmo erro.

quarks
fonte
10
tente executar mvn clean testuma vez que compilará todas as classes de teste
Jigar Joshi
1
Você pode verificar se com.myproject.server.MyTest está na pasta bin? Quer dizer, se ele não for compilado devido a um erro de compilação ou de caminho de construção, você receberá esse erro.
vikas
você está testando uma classe ou todo o projeto?
Doszi89
Possível duplicata de Eclipse - java.lang.ClassNotFoundException
Amos M. Carpenter
1
No meu caso, a execução de testes usando Maven funcionou, mas se eu clicar com o botão direito do mouse em uma classe de teste e escolher Executar como -> Teste JUnit, ele relatará ClassNotFoundException.
Corrigi

Respostas:

120

Isso parece ocorrer porque apenas o código-fonte está compilando quando você usa mvn clean compile(estou usando o maven 3.1.0, então não tenho certeza se ele sempre se comportou assim).

Se você executar mvn test, o código de teste também será compilado, mas então ele executa os testes (o que pode não ser desejável imediatamente se você estiver tentando executá-los por meio do Eclipse). A maneira de contornar isso é adicionar test-compileà sua sequência de comando Maven sempre que você faz um mvn clean. Por exemplo, você correria mvn clean compile test-compile.

Newtrino
fonte
1
Isso aconteceu uma vez e a resposta de slomek funcionou e, em seguida, esse mesmo erro aconteceu novamente, então eu tive que tentar fazer isso também. Funciona bem novamente agora, portanto, por segurança, você pode querer fazer as duas coisas.
Roger,
Obrigado, funcionou para mim. Mas no meu caso, não funcionou até fechar e reabrir o projeto em eclipse.
Paramesh Korrakuti
Em palavras simples, faça um 'mvn clean test-compile' e então execute seus testes Junit no eclipse. Funcionou para mim Obrigado.
Sreram
103

Tive um problema semelhante com meus testes e descobri em algum lugar da Web, que você deve ir para Build Path nas propriedades do seu projeto e mover Maven Dependencies acima da JRE System Library . Isso parece ter funcionado para mim.

Slomek
fonte
1
Obrigado, isso resolveu meu problema. O teste real estava obtendo o erro class not found quando tentei executá-lo. Acho que esta é provavelmente uma primeira etapa preferível antes de adicionar alvos de compilação de mvn extras.
Roger
8
Este método é descrito com capturas de tela nesta postagem (caso as etapas não estejam claras na resposta de @slomek acima)
anulado em
2
Não consegui mover Maven Managed Dependencies acima da JRE System Library no Eclipse Mars 2, mas pude clicar com o botão direito do mouse no projeto e ir para Properties -> Builders e mover Maven Project Builder acima do Java Builder e funcionou para mim.
xorcus
Tentei todos os itens acima e não funcionou. Também não consegui mover as dependências do Maven sobre a biblioteca do sistema JRE, mas isso estava na guia Bibliotecas. Em seguida, fui para Build Path -> Order & Export ->, pois era capaz de mover Maven Dependencies acima da biblioteca do sistema JRE. Então eu construí o projeto e executei uma instalação do Maven, então o teste foi executado com sucesso.
Megan
22

Eu enfrentei o mesmo problema e fui capaz de corrigi-lo usando a resposta de @slomek, mas o problema reapareceu depois disso.

Eu finalmente consertei adicionando a pasta de saída do meu projeto à configuração de execução do teste JUnit. As etapas são:

  • Encontre a pasta de saída do seu projeto em Project properties -> Java Build Path -> Default output folder
    • Normalmente isso é <project-folder>/bin
  • Vamos para Run -> Run Configurations...
  • Clique na configuração de execução do teste de unidade e clique na Classpathguia
  • Adicione explicitamente a pasta de saída do seu projeto em User Entries- mesmo se o projeto já estiver incluído lá
    • Clique em Advanced -> Add folderpara adicionar a pasta de saída

Esse problema pode ser devido à configuração estranha do projeto no Eclipse - por exemplo, pasta de origem com projetos maven aninhados importados como um único projeto / pasta (pelo menos foi assim que meu projeto foi configurado).

nilado
fonte
Muito obrigado; Eu tive esse problema. Sua correção funcionou para mim; os dois primeiros não. Votado.
dia
Absolutamente brilhante! Estou coçando minha cabeça há séculos por causa disso. Obrigado!
RayCh
17

Se esse problema ocorrer apenas no Eclipse, executar o comando Projeto -> Limpar ... no projeto selecionado pode ajudar.

johanwannheden
fonte
Obrigado - na verdade funcionou para mim - JAVE EE eclipse gradlew
Abdeali Chandanwala
11

Depois de ter tentado tudo aqui sem melhorias, resolvi meu problema apenas reiniciando o Eclipse

Berit Larsen
fonte
5

Corrigi meu problema executando a atualização do maven. Clique com o botão direito do mouse em project your project> Maven> Update Project

Azianês
fonte
3

No meu caso, eu tinha uma estrutura de diretório maven errada.

Que deve ser assim:

/ src / test / java / com.myproject.server.MyTest

Depois de consertar isso - tudo funcionou como um encanto.

ITisha
fonte
2

No meu caso, apenas as próximas etapas me ajudaram a resolver esse problema:

  1. Projeto-> propriedades-> Configurações de execução / depuração.
  2. Em "Configurações de inicialização para '.....'" selecione classes / projetos
  3. Editar -> Classpath -> "Restaurar entradas padrão"
Roman Romaniuk
fonte
Obrigado!! Só este me ajudou !!
sumandas
1

Anteriormente, neste caso, eu sempre fiz mvn eclipse:eclipsee reiniciei meu Eclipse e funcionou. Depois de migrar para o GIT, ele parou de funcionar para mim, o que é um pouco estranho.

O problema básico aqui é que o Sr. Eclipse não encontra a classe compilada. Em seguida, defini a pasta de saída como Project / target / test-classes que é gerada por padrão mvn clean installsem pular o teste e continuei com a seguinte solução alternativa:

Opção 1: definir o caminho de classe para cada caso de teste

Eclipse -> Executar -> Configurações de Execução -> sob JUnit-> selecione mytest -> na guia Classpath-> Selecionar Entradas de Usuário-> Avançado-> Adicionar Pasta -> Selecionar -> Aplicar-> Executar

Opção 2: crie uma variável de caminho de classe e inclua-a no caminho de classe para todos os casos de teste

Eclipse -> Windows -> Variáveis ​​do Classpath -> Novo -> [Nome: Junit_test_cases_cp | path:] -> ok Em seguida, vá para Eclipse-> Executar -> Configurações de execução -> JUnit-> selecione mytest -> na guia de caminho de classe -> Selecionar entradas de usuário-> Avançado-> Adicionar variáveis ​​de caminho de classe-> Selecionar Junit_test_cases_cp-> ok- > Aplicar-> Executar

Esta é a única coisa que está funcionando para mim, depois de tentar todas as sugestões online.

user3222211
fonte
1

Tive o mesmo problema com um projeto Gradle com um SourceSet de teste com dois diretórios de recursos.

Este snippet vem de um main-module.gradle e adiciona um diretório de recursos ao SourceSet de teste:

sourceSets {
    test {
        resources {
            srcDir('../other-module/src/test/resources')
        }
    }
}

Ao fazer isso, eu tinha dois diretórios de recursos relacionados ao SourceSet de teste do módulo principal do projeto:

../other-module/src/test/resources src / test / resources (relativo à pasta do módulo principal, adicionado automaticamente pelo plugin java)

Descobri que, se eu tivesse dois arquivos com o mesmo nome em ambos os diretórios de origem, algo deu errado no estágio de recursos do processo. Como resultado, nenhuma compilação foi iniciada e por este motivo nenhum .class foi copiado para o diretório bin, onde JUnit estava procurando as classes. O ClassNotFoundException desapareceu apenas renomeando um dos dois arquivos.

David Obber
fonte
1

NoClassDefFoundError realmente significa que não pode inicializar a classe. Não tem nada a ver com encontrar a classe. Recebi este erro ao chamar trim () em uma String nula.

JUnit não mostrará NullPointerException. A string não é nula durante a execução normal porque estou obtendo a string de um arquivo de propriedades que não está disponível para testes.

Meu conselho é remover partes da classe até que seus testes comecem a passar. Então você pode determinar qual linha está apresentando o erro.

Philip Rego
fonte
0

Eu tive um problema semelhante com meu Eclipse Helios, que depurava Junits. Meu problema era um pouco diferente, pois era capaz de executar o Junits com êxito, mas quando estava obtendo ClassNotFoundException durante a depuração dos mesmos JUNITs.

Eu tentei todos os tipos de soluções diferentes disponíveis em Stackoverflow.com e fóruns em outros lugares, mas nada parece funcionar. Depois de bater minha cabeça com esses problemas por quase dois dias, finalmente descobri a solução para eles.

Se nenhuma das soluções parecer funcionar, apenas exclua a pasta .metadata criada em sua área de trabalho. Isso criaria uma sobrecarga adicional de importação de projetos e todos os tipos de configuração que você fez, mas isso certamente resolverá esses problemas.

Espero que isso ajude.

Nayan
fonte
Como uma observação ... fazer isso exigirá que você reconstrua seu ambiente. Portanto, embora possa ser uma solução, basta estar ciente do que você está prestes a fazer ...
Bob
0

Essas etapas funcionaram para mim.

  • Exclua o conteúdo do repositório Maven local.
  • execute mvn clean install na linha de comando. (cd para o diretório pom).
  • Construir projeto no Eclipse.
Jake Graham Arnold
fonte
0

Eclipse de 1- mvn: eclipse

2- projeto limpa todos os projetos

3- reiniciar

Toumi
fonte
0

Vale a pena mencionar como outra resposta que se você estiver usando eGit e seu classpath for atualizado por causa de, digamos, uma ferramenta de cobertura de teste como Clover, às vezes há um soluço de limpeza que não exclui completamente o conteúdo de /path/to/git/repository/<project name>/bin/

Basicamente, usei o Error Log View do Eclipse, identifiquei o que estava causando problemas durante esse esforço de limpeza, naveguei até o diretório de origem e excluí manualmente o <project name>/bindiretório. Assim que terminei, voltei para o Eclipse e atualizei ( F5) meu projeto e o erro foi embora.

Blake Neal
fonte
0

Verifique se o seu projeto está aberto como um projeto Maven e não apenas um projeto Java normal. Na verdade, um acéfalo, mas esse é exatamente o mesmo motivo pelo qual você pode perdê-lo.

Ben
fonte
0

Também pode ser devido a "[ERROR] Nenhum compilador é fornecido neste ambiente. Talvez você esteja executando em um JRE em vez de um JDK?"

William
fonte
0

Eu havia enfrentado o mesmo problema. Eu resolvi isso removendo a dependência JUnit jar externa que adicionei por download da Internet externamente. Mas então fui para projeto-> propriedades-> caminho de construção-> adicionar biblioteca-> junit-> selecionei a versão (ex junit4) -> aplicar.

Ele adicionou automaticamente a dependência. resolveu meu problema.

Agniva Dutta
fonte
0

Fazer algumas alterações fictícias e salvar a classe de teste pode resolver o problema. Ele irá construir o .class automaticamente

Lorenzo Lerate
fonte
0

Parece problema de compilação. Execute o projeto como teste Maven e, em seguida, execute como teste JUnit.

Yao Li
fonte
0

Por favor, verifique se você adicionou junit4 como dependência.

por exemplo

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
Ishan Liyanage
fonte
-5

Pode ser que você tenha esquecido de colocar a classe Principal e a classe Caso de Teste em / src / test / java. Verifique uma vez.

Sathya
fonte
1
java.lang.ClassNotFoundException vem quando a classe já está compilada, mas em tempo de execução devido ao classpath não configurado corretamente.
Nitin Mahesh