For testing static method I am using Power mock and pom.xml entry for this is
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.4.9</version>
<scope>test</scope>
</dependency>
`
I am running test cases from command prompt which gives me error like
java.lang.RuntimeException: java.lang.ClassNotFoundException: org.mockito.internal.progress.ThreadSafeMockingProgress
at org.powermock.api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:52)
However from Intellij ide, if I run the all test cases(right click on the project + Run "All tests") it works absolutely fine. Does anybody have any idea on this issue?
when you are defining the power mock jars in pom.xml, you don't need to explicitly define dependent jars as incompatible versions may come in the classpath. Use below two versions & remove mockito dependency in you pom.
<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>
Related
I added Junit 5.5.1 to a project that otherwise uses 4.11. I've written tests that, until today, were running just fine. Today all the tests were failing with exit code -1 even before any of the test class was executed. I'm not aware of any dependencies changing that would cause this.
I switched to 5.6.0-RC1, which seemed to be missing an extension class (TestInstancePreDestroyCallback).
I then tried noticed 5.5.2 and switched to it: it had the same problem as 5.5.1.
I gave 5.6.0-RC1 one more try - this time I noticed that the jar was named 5.6.0-M1. This version worked, so I seem to be okay, but that was an unsettling and not-confidence-inspiring sequence of events.
My question is: has this happened to anyone else, and what exactly was it?
Update: Turns out the class missing in 5.6.0-M1 is present in 5.6.0-RC1, so I've switched to it. I'm not pursuing the 5.5.* problems any further.
In my case I was getting this error because I had included both in my Spring Boot Application
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
and
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.6.0</version>
<scope>test</scope>
</dependency>
I removed the latter and it worked fine for me.
I was pulling my hair out with this problem. At first, I was missing this dependency
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
but even though I had all the correct dependencies, it didn't fix this error. Finally, I decided to, in intelliJ, invalidate the caches and restart (File -> Invalidate Caches / Restart) and it worked. Not sure what the heck was going on, but that was my solution.
Ultimately, here are my JUnit/Mockito dependencies:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.3.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>3.3.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>
In my case it was jupiter dependencies.
You should have:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
or:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
I use pom.xml on my project and found the issue with project library.
Library available on src\test\java but not on src\main\java
How to make library available for both main and test?
Here is snippet from pom.xml
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.0</version>
<scope>test</scope>
</dependency>
Edit your pom.xml to:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.0</version>
<scope>compile</scope>
</dependency>
This problem caused due to you set your dependency could only seen in test scope. (scope in dependency)
See also: Maven Dependency Scope
I currently want to run JUnits using PowerMockito on CI server using Tycho-Surefire (OSGi project). I prepared simple class:
#RunWith(PowerMockRunner.class)
public class SampleFirstTest {
#Test
public void addingTest() {
assertEquals(10, 10);
}
This test class perfectly and successfully runs when has no #RunWith annotation, but when I add this annotation I get:
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.eclipse.tycho:tycho-surefire-plugin:0.24.0:test (default-cli) on project jenkins.junit: There are test failures.
(Btw. This class should work with annotation because when I use eclipse launcher it works in both ways)
And In test report I get:
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.827 sec <<< FAILURE! - in sample.SampleFirstTest
initializationError(sample.SampleFirstTest) Time elapsed: 0 sec <<< ERROR!
org.powermock.reflect.exceptions.FieldNotFoundException: Field 'fTestClass' was not found in class org.junit.internal.runners.MethodValidator.
at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:581)
I read that to fix that problem I should use JUnit version 4.1.1 and PowerMock 1.5.6 but It still fails... This is important part of parent pom:
<properties>
<tycho-version>0.24.0</tycho-version>
<release-version>1.0/20</release-version>
<show-eclipse-log>true</show-eclipse-log>
<junit-version>4.1.1</junit-version>
<powermock.version>1.5.6</powermock.version>
</properties>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-surefire-plugin</artifactId>
<version>${tycho-version}</version>
<configuration>
<argLine>-XX:-UseSplitVerifier</argLine>
<osgiDataDirectory>${basedir}/runtime-workspace-junit/</osgiDataDirectory>
<deleteOsgiDataDirectory>false</deleteOsgiDataDirectory>
<useUIHarness>false</useUIHarness>
<useUIThread>false</useUIThread>
<dependencyManagement>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
</dependencyManagement>
</configuration>
</plugin>
<dependencies>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-easymock</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-classloading-base</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jboss</groupId>
<artifactId>javassist</artifactId>
<version>3.8.0.GA</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>15.0</version>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr</artifactId>
<version>3.2</version>
</dependency>
</dependencies>
To test I use:
mvn clean package target-platform-configuration:target-platform tycho-surefire:test -X
Update:
Notice that for OSGi the last version is 1.5.6 - https://code.google.com/p/powermock-osgi/
So in my case I want to stay in 1.5.6 version. And JUnit 4.11 but with some reason it still do not work.
Thanks in advance for replays ! :)
Ok now I know what was the reason. I had a plugin which has dependency to org.junit, I just had to exclude version 4.12 and everything is ok.
I have a problem with my project. When I do unit test for Spring Controller using MockMvc and Mockito, I get following error:
java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletException
It happens due to the this.mockMvc = MockMvcBuilders.standaloneSetup(custCont).build();line. I'm using maven for my dependencies, here they are:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.3.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
</dependency>
</dependencies>
If you need any more info on the matter, I'd be more than happy to provide. Please, help me figure out what's causing the error.
I'm trying to get all these disparate things working together for some unit testing.
So the basic program structure is simple Servlet 3.0 running on TomCat as a WebApp maven archetype. Using Weld as an implementation of CDI to inject service objects into the Servlets.
Which is all running.
My problem currently is in the unit tests. I don't want to be running Integration Tests so I want to use the dependency injection to add some mock Service objects to the Service and fake some API calls.
So I've tried some approaches like this:
https://community.jboss.org/wiki/CreatingUnitTestsWithWeldAndJunit4
For making a custom runner for JUnit to run the CDI, however this always failed to actually inject anything into the Servlet object I instantiated, it could inject into the Test class itself though.
So I'm trying Arquillian having gone over the documentation:
http://arquillian.org/guides/getting_started/?utm_source=cta
However I can't get this to run as it either can't find the container or I get Error could not create new instance of class org.jboss.arquillian.test.impl.EventTestRunner
Maven:
<dependencies>
<!-- Testing dependencies -->
<dependency>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian</groupId>
<artifactId>arquillian-bom</artifactId>
<version>1.1.2.Final</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-impl-maven</artifactId>
<version>2.0.2</version>
<!-- 2.0.0-beta-4 is not working ** we are using old version -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.shrinkwrap.descriptors</groupId>
<artifactId>shrinkwrap-descriptors-impl-javaee</artifactId>
<version>2.0.0-alpha-5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-api-maven</artifactId>
<version>2.1.0-alpha-1</version>
</dependency>
<dependency>
<groupId>org.jboss.weld.arquillian.container</groupId>
<artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
<scope>test</scope>
<version>1.1.2.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core</artifactId>
<version>2.1.2.Final</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.1.2.Final</version>
</dependency>
<!-- Servlet 3.0 APIs -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>7.0.30</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
Test code:
#RunWith(Arquillian.class)
public class TestSessionServlet {
#Deployment
#OverProtocol("Servlet 3.0")
#TargetsContainer("weld")
public static WebArchive createDeployment() {
return ShrinkWrap.create(WebArchive.class)
.addClass(JedisSessionDao.class)
.addAsLibraries(resolver.artifact("org.jboss.weld.servlet:weld-servlet"))
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")
.addAsManifestResource("in-container-context.xml",
"context.xml").setWebXML("in-container-web.xml");
}
#Test
public void testServlet() throws Exception {
Assert.fail("Not yet implemented");
}
Is this the right approach or do I really need to use Tomcat embedded containers? Which seems like integration testing. My plan was to use Mockito to create faked HttpRequest and Response objects and redirect the Response Writer to a StringWriter. I got all that part running it was just the CDI that I couldn't manage.
Thanks in advance
OK what solved this for me was moving from:
<dependency>
<groupId>org.jboss.weld.arquillian.container</groupId>
<artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
<scope>test</scope>
<version>1.1.2.Final</version>
</dependency>
To
<dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>arquillian-weld-se-embedded-1.1</artifactId>
<scope>test</scope>
<version>1.0.0.CR7</version>
</dependency>