我正在开发一个网络应用程序,我希望得到正确的单元测试.这个时候我们会这样做,你知道吗?:)
不过,我在测试网络连接时遇到了麻烦.
在我的应用程序中,我使用plain java.net.Sockets.
例如:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Message {
byte[] payload;
public Message(byte[] payload) {
this.payload = payload;
}
public boolean sendTo(String hostname, int port) {
boolean sent = false;
try {
Socket socket = new Socket(hostname, port);
OutputStream out = socket.getOutputStream();
out.write(payload);
socket.close();
sent = true;
} catch (UnknownHostException e) {
} catch (IOException e) {
}
return sent;
}
}
Run Code Online (Sandbox Code Playgroud)
我读到了关于嘲笑但不确定如何应用它.
我想模拟一个继承的受保护方法.我无法直接从java代码调用此方法,因为它从另一个包中的类继承.我找不到一种方法来指定这个方法来存入when(...)
package a;
public class A() {
protected int m() {}
}
package b;
public class B extends a.A {
// this class currently does not override m method from a.A
public asd() {}
}
// test
package b;
class BTest {
@Test
public void testClass() {
B instance = PowerMockito.spy(new B());
PowerMockito.when(instance, <specify a method m>).thenReturn(123);
//PowerMockito.when(instance.m()).thenReturn(123); -- obviously does not work
}
}
Run Code Online (Sandbox Code Playgroud)
我查看了PowerMockito.when覆盖,这似乎只是私人方法!
如何指定受保护的方法?
我确信这是一个很常见的问题,但我真的无法摆脱这个问题,因为我在模拟私有方法时会在内部调用另一个方法并返回一个集合。我正在测试的类有一个公共方法,它调用私有方法来获取 Collection 对象。我使用 PowerMock 创建私有方法的间谍。
public void method1(String s)
{
Collection<Object> list = invokePrivate()
}
private Collection<Object> invokePrivate()
{
Wrapper wrapperObj = Factory.getInstance.getWrapper();
Collection<Object> list = wrapperObj.callWrapperMethod(); // This always calls into real method, instead of mocked version.
return list;
}
Run Code Online (Sandbox Code Playgroud)
测试类-:
因此,为了测试公共方法“method1”,我使用 PowerMockito 创建一个间谍来监视私有方法并返回演示列表。
MainClass obj = new MainClass();
MainClass spy = PowerMockito.spy(obj);
PowerMockito.when(spy, method(MainClass.class, "inokePrivate"))
.thenReturn(list); // demo list which exists as a test class member.
Run Code Online (Sandbox Code Playgroud)
上面调用了私有方法,该方法又尝试调用位于不同工件中的wrapperObj.callWrapperMethod(),并在那里中断,因为它在那里找不到某些实现。所以我尝试模拟wrapperObj.callWrapperMethod。
WrapperClass wr = new WrapperClass();
WrapperClass spy1 = PowerMockito.spy(wr);
when(spy1.callWrapperMethod()).thenReturn(list) // …Run Code Online (Sandbox Code Playgroud) java ×3
mockito ×2
powermock ×2
unit-testing ×2
junit ×1
mocking ×1
powermockito ×1
sockets ×1