0
点赞
收藏
分享

微信扫一扫

Build Spring Unit test by using PowerMock with Mockito

木匠0819 2023-04-20 阅读 60


sometimes we need to test final class or static class, at this time we need powermock.

1, update pom.xml to import powermock


<dependency>
		<groupId>org.powermock</groupId>
		<artifactId>powermock-core</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.powermock</groupId>
		<artifactId>powermock-module-junit4</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.powermock</groupId>
		<artifactId>powermock-api-mockito</artifactId>
		<scope>test</scope>
	</dependency>


 2. then we can use powermock in unit test like below:

in this example, ReadInputRegistersResponse is a final class.

@RunWith(PowerMockRunner.class)
@PrepareForTest(ReadInputRegistersResponse.class)
public class InverterDetailsResponseTest {

private ReadInputRegistersResponse mockModbusResp;

    @test
    public void test1() {
        mockModbusResp = mock(ReadInputRegistersResponse.class);
        // ......
}

 

but sometimes in unit test, we need have @RunWith(SpringJUnit4ClassRunner.class), when we still need powermock, we will avoid @RunWith(PowerMockRunner.class).

below is the example how to avoid @RunWith(PowerMockRunner.class), but still use powermock.

1. it is simple , just add : PowerMockAgent.initializeIfNeeded() method.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/inverter-persistent-config.xml"})
public class TcpModbusServiceTest extends AbstractInverterTest {
    static {
        PowerMockAgent.initializeIfNeeded();
    }
}

Note:

at this time the mocked class should be a local variable like this:

private void mockModbusResponse() throws CommunicationException {
        ReadInputRegistersResponse mockModbusResp = mock(ReadInputRegistersResponse.class);
// ... ... ...
}

  

 

2. if you are using maven and want to run test by mvn test, then you need to add below lines in build config as well:



<build>
<plugins>
		    <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <excludes>
			          <exclude>**/*IT.java</exclude>
			          <exclude>**/Abstract*.java</exclude>
			        </excludes>
                    <argLine>
                        -javaagent:${settings.localRepository}/org/powermock/powermock-module-javaagent/${powermock.version}/powermock-module-javaagent-${powermock.version}.jar
                    </argLine>
                    <useSystemClassloader>true</useSystemClassloader>
                </configuration>
            </plugin>
</plugins>
</build>


 

3. in pom.xml dependency is a bit different:



<dependency>
			<groupId>org.powermock</groupId>
			<artifactId>powermock-module-junit4-rule-agent</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
            <groupId>org.powermock.tests</groupId>
            <artifactId>powermock-tests-utils</artifactId>
            <scope>test</scope>
        </dependency>		
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.powermock</groupId>
			<artifactId>powermock-core</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.powermock</groupId>
			<artifactId>powermock-module-junit4</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.powermock</groupId>
			<artifactId>powermock-api-mockito</artifactId>
			<scope>test</scope>
		</dependency>



 

 

that's it.

 

举报

相关推荐

0 条评论