[JAVA] MOCK les constructeurs d'autres classes avec Spring MVC + PowerMock + Junit

Comment utiliser PowerMock

Informations environnementales

domain/pom.xml(Extrait)


		<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
		<dependency>
			<groupId>com.jcraft</groupId>
			<artifactId>jsch</artifactId>
			<version>0.1.54</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.powermock/powermock -->
		<dependency>
			<groupId>org.powermock</groupId>
			<artifactId>powermock-module-junit4-legacy</artifactId>
			<version>${powermock.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>
		<dependency>
			<groupId>org.powermock</groupId>
			<artifactId>powermock-module-junit4-rule</artifactId>
			<version>${powermock.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.powermock</groupId>
			<artifactId>powermock-classloading-xstream</artifactId>
			<version>${powermock.version}</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

Classe d'essai


package training.domain.service;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(CallJsch.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:test-context.xml"})
public class CallJschTest {

	@Mock
	private JschTraining mock;

	@InjectMocks
	public CallJsch target = spy(new CallJsch());

	@Test
	public void test1() throws Exception {
		{
			MockitoAnnotations.initMocks(this);

			PowerMockito.whenNew(JschTraining.class).withAnyArguments().thenReturn(mock);
			PowerMockito.when(mock.exec(any())).thenReturn("SUCCESS");
		}

		target = new CallJsch();
		String str = target.call("root", "127.0.0.0", 22, "Administrator", 10);
		assertThat(str ,is("SUCCESS"));

	}

}

Cible de test


package training.domain.service;

import java.io.IOException;

import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;

public class CallJsch {

	public String call(String user, String host, int port, String password, int timeout)
			throws JSchException, IOException, SftpException, Exception {
		JschTraining target = new JschTraining(user, host, port, password, timeout);
		return target.exec("ECHO TEST");
	}

}

Classe appelée par la cible de test


package training.domain.service;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class JschTraining {

	JSch jsch;
	Session session;
	ChannelExec channel;

	public JschTraining(String user, String host, int port, String password, int timeout) throws JSchException {
		jsch = new JSch();
		session = jsch.getSession(user, host, port);
		// known_Ignorer la vérification des hôtes
		session.setConfig("StrictHostKeyChecking", "no");
		session.setPassword(password);
		session.setTimeout(timeout);
		session.connect();
		channel = (ChannelExec) session.openChannel("exec");
	}

	public String exec(String command) throws JSchException, SftpException, FileNotFoundException, IOException {
		BufferedInputStream bin = null;
		ByteArrayOutputStream bout = null;
		try {
			channel.setCommand(command);
			channel.connect();

			//Exécution de la commande
			bin = new BufferedInputStream(channel.getInputStream());
			bout = new ByteArrayOutputStream();
			byte[] buf = new byte[1024];
			int length;
			while (true) {
				length = bin.read(buf);
				if (length == -1) {
					break;
				}
				bout.write(buf, 0, length);
			}
			//Sortie standard
			System.out.format("Résultat d'exécution=%1$s", new String(bout.toByteArray(), StandardCharsets.UTF_8));
		} finally {
			if (bin != null) {
				try {
					bin.close();
				} catch (IOException e) {
				}
			}
			if (channel != null) {
				try {
					channel.disconnect();
				} catch (Exception e) {
				}
			}
			if (session != null) {
				try {
					session.disconnect();
				} catch (Exception e) {
				}
			}
		}
		return new String(bout.toByteArray(), StandardCharsets.UTF_8);
	}
}

point

@PrepareForTest (CallJsch.class) ← C'est la classe à tester

@Mock private JschTraining mock; ← Ceci est une autre classe appelée par le sujet de test

Recommended Posts

MOCK les constructeurs d'autres classes avec Spring MVC + PowerMock + Junit
Testez le contrôleur avec Mock MVC dans Spring Boot
Mock Enum avec PowerMock
Configuration Java avec Spring MVC
Méthodes statiques simulées avec PowerMock
Mock le constructeur avec PowerMock
Implémenter le téléchargement de fichiers avec Spring MVC
Contrôleur de cadre de test Spring avec Junit
Implémenter l'entrée / sortie d'image avec Spring MVC