[英]Jsch mock Java - Mockito/ PowerMockito
我正在嘗試為以下代碼編寫單元測試並且遇到困難。 請幫忙。 我不確定如何編寫測試,尤其是圍繞返回 void 的方法,如 addIdentity() 和 connect()。 我正在使用 Mockito 和 powerMockito 框架。
public class A {
public method1() {
//some code here
method2();
//more code here
}
private void method2() {
JSch jsch = new JSch();
Session jschSession = null;
try {
jsch.addIdentity("key");
jschSession = jsch.getSession("userID", "somedomain", 22);
//jsch code
}
}
}
這就是我的測試的樣子:
@Test
public void my_Test() throws JSchException {
A test = new A();
JSch mockJsch = Mockito.mock(JSch.class);
whenNew(JSch.class).withNoArguments().thenReturn(mockJsch);
test.method1();
}
Mocking JSch
不會幫助您完成當前的實現,因為您總是使用 new 創建JSch
的new
實例。 這樣,您目前沒有機會從外部傳遞JSch
的模擬版本。
更好的方法是將JSch
的實例作為A
的構造函數的一部分傳遞。 這使您可以靈活地在測試時傳遞任何JSch
實例。 對於運行時,您可以使用依賴注入框架(例如 Spring 或 Jakarta EE/Microprofile/Quarkus 的一部分的 CDI)來注入一個實例(在您聲明一個之后)。
您可以重構您的 class A
,如下所示:
public class A {
private final JSch jsch;
public A (Jsch jsch) {
this.jsch = jsch;
}
public method1() {
//some code here
method2();
//more code here
}
private void method2() {
com.jcraft.jsch.Session jschSession = null;
try {
jsch.addIdentity("key");
jschSession = jsch.getSession("userID", "somedomain", 22);
jschSession.setConfig("StrictHostKeyChecking", "no");
jschSession.connect();
Channel channel = jschSession.openChannel("sftp");
channel.connect();
ChannelSftp sftpObj = (ChannelSftp) channel;
sftpObj.exit();
jschSession.disconnect();
}
}
}
然后您可以將Jsch
的模擬實例傳遞給您的 class 正在測試( A
),並完全控制Jsch
的行為
@Test
public void my_Test() throws JSchException {
JSch mockJsch = Mockito.mock(JSch.class);
A test = new A(mockJsch);
when(mockJsch.getSession("", "").thenReturn(yourSession);
test.method1();
}
此測試無需使用 PowerMock,我寧願只使用 JUnit 和 Mockito。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.