Correndo Junit & Powermock com Mockito através do Powermockrunner de Maven
Pergunta
Não estou sendo capaz de executar o PowerMock através do Maven. Eu sou o Powermock Mockito e o PowerMockRunner para dirigir um teste de Junit.
Aqui está o teste:
@RunWith(PowerMockRunner.class)
@PrepareForTest( { UserLocalServiceUtil.class, ExpandoBridge.class })
public class AlertNotificationsTest {
//...
Não configurei nada especial para executar o teste. Meu POM faz referência aos seguintes depósitos:
- org.mockito | Mockito-All | 1.8.0
- Junit | Junit | 4.6.0
- org.powermock.modules | PowerMock-Module-Junit4 | 1.3.1
- org.powermock.api | Powermock-api-mockito | 1.3.1
Quando eu corro mvn -Dtest=AlertNotificationsTest test
A MVN diz que não há teste para executar. Mas se eu executar a mesma classe de teste do Eclipse, tudo corre bem.
Estou fazendo algo errado?
Aqui está o meu pom.xml abaixo (as partes relevantes)
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.9</version>
<classifier>jdk15</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock.modules</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock.api</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.3.1</version>
<scope>test</scope>
</dependency>
</dependencies>
Aqui está a saída do maven
MVN -DTEST = AlertNotificationstest Test
...
[INFO] Surefire report directory: C:\Devel\Java\EP_PORTAL\information-provider\target\surefi
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestSuite
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.313 sec
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] No tests were executed! (Set -DfailIfNoTests=false to ignore this error.)
[INFO] ------------------------------------------------------------------------
Observação: Eu posso executar outros testes, simplesmente não consigo executar este teste. Se eu fizer o AlertNotificationsTest
Classe estende junit.framework.TestCase
A aula é apanhada pelo Maven, mas parece que não é motivada por PowerMockRunner
.
Aqui está a saída disso:
Running TestSuite
[ERROR]: No test suite found. Nothing to run
Tests run: 4, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 1.053 sec <<< FAILURE!
Results :
Failed tests:
testSingleEventNotification(pt.estradasportugal.traffic.services.events.AlertNotificationsTest)
testTwoEventNotification(pt.estradasportugal.traffic.services.events.AlertNotificationsTest)
Tests run: 4, Failures: 2, Errors: 0, Skipped: 0
Novamente, esses testes funcionam bem com o Eclipse.
Atualizar Encontrei um possível problema e solução alternativa. Eu tenho testes com testng e junit. Se eu remover o teste do meu POM e migrar todos os meus testes para o Junit, sou capaz de executar meu teste de PowerMock com mvn test
. Parece que há um problema com o Maven e o Junit/Testng Combo.
Eu gostaria de poder correr os dois, mas se não encontrar um caminho, vou responder minha própria pergunta. Obrigado caras e garotas
Solução 7
Houve um problema ao misturar testes de teste e Junit. Migrar todos os testes para Junit resolveu meu problema. Obrigado rapazes.
Outras dicas
Acabei de ter esse erro e trabalhei com a solução. Meu arquivo pom.xml tinha a seguinte dependência:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-mockito-release-full</artifactId>
<version>1.5</version>
<classifier>full</classifier>
<scope>test</scope>
</dependency>
O problema vem do fato de que meu código usa o JUNIT e a dependência acima tem uma dependência externa do teste. Isso estava impedindo que meu teste seja executado. Por que eu não sei - você teria uma estrutura de teste teria sido testado um pouco melhor !!!
De qualquer forma, a solução foi dividir as dependências 'completas' para apenas as necessárias:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
Isso resolveu. Btw eu usei mvn dependency:tree
para entender as dependências associadas.
Não posso reproduzir seu problema. Com o seguinte conteúdo no meu pom.xml:
<repositories>
<repository>
<id>powermock-repo</id>
<url>http://powermock.googlecode.com/svn/repo/</url>
</repository>
</repositories>
<properties>
<powermock.version>1.3.1</powermock.version>
</properties>
<dependencies>
<dependency>
<groupId>org.powermock.modules</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock.api</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.0</version>
</dependency>
</dependencies>
E a aula de teste a seguir (pulando as importações):
@RunWith(PowerMockRunner.class)
@PrepareForTest( { App.class })
public class AppTest {
@Test
public void testApp() {
assertTrue(true);
}
}
Corrida mvn test -Dtest=AppTest
Apenas funciona bem e me dê a seguinte saída:
... ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.mycompany.app.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.135 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3 seconds [INFO] Finished at: Wed Nov 25 17:34:32 CET 2009 [INFO] Final Memory: 9M/79M [INFO] ------------------------------------------------------------------------
Portanto, a pergunta é: você tem um método anotado com @Test
dentro AlertNotificationsTest
?
Também me deparei com essa edição, mas não é uma questão do Powermock. Minha aula de teste foi nomeada xstatictests.java.
Quando eu executo "MVN Limpe Test", esse teste não funcionaria, ele só funcionou quando eu especifiquei o teste usando "-dtest = ..."
A documentação Surefire menciona que, por padrão, apenas esses padrões são pesquisados: "/Test*.java " - Inclui todos os seus subdiretos e todos os nomes de arquivos Java que começam com" teste "./Test.java " - inclui todos os seus subdiretos e todos os nomes de arquivos Java que terminam com" teste ".*/*Testcase.java " - Inclui todos os seus subdiretos e todos os nomes de arquivos Java que terminam com" Testcase ".
Portanto, alterar o nome da classe para um que termina com um deles será executado quando o "teste MVN" for chamado, caso contrário, o plug -in SureFire precisa ser configurado com o nome da classe especificamente.
A configuração do PowerMock parece boa para mim, e os frascos parecem bem (assumindo
O Eclipse pode estar usando sua própria biblioteca Junit "interna", portanto, os diferentes comportamentos?
O teste está anotado com org.junit.@Teste?
Se você olhar para a fonte do plug -in Surefire, ele fará algumas coisas sorrateiras. Se encontrar algum pacotes de teste no carregador de classe, optará por executar um testng testRunner. Ainda não vi nenhum exemplo dos testes JUNIT e TESTNG, executando bem lado a lado.
Eu tive o mesmo problema, e demorei um pouco para descobrir. Minha configuração estava puxando uma versão mais antiga do Jboss.javassist, que estranhamente impedia que o PowerMockrunner trabalhasse.
Vale a pena notar que eu também tenho um ambiente misto de Junit / Testng. Anteriormente, tentei a solução de adicionar vários fornecedores de sufire e isso também não funcionou (usando o Surefire 2.14.1). Depois de atualizar para o Serrefire 2.17, meus testes JUNIT e TESTNG começaram a funcionar sem a necessidade de declarar provedores infalíveis.
Aqui está a minha seção de plug -in ...
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<groups>spring, unit, integration</groups>
<systemPropertyVariables>
<java.awt.headless>true</java.awt.headless>
<org.apache.activemq.default.directory.prefix>target/test/</org.apache.activemq.default.directory.prefix>
<log4j.configuration>file:${project.basedir}/src/test/resources/log4j.properties</log4j.configuration>
</systemPropertyVariables>
<argLine>${surefire.args}</argLine>
</configuration>
</plugin>
... e o teste relevante deps ...
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<!--
PowerMock versions are compatible with specific Mockito versions.
https://code.google.com/p/powermock/wiki/MockitoUsage13
-->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<!-- without this PowerMock tests don't run in maven -->
<dependency>
<groupId>jboss</groupId>
<artifactId>javassist</artifactId>
<version>3.8.0.GA</version>
<scope>test</scope>
</dependency>