[英]EasyMock + PowerMock : How to mock field?
讓我們看一下這段代碼:
public class A {
public void doSmth() { // pay attention - void method
// impl
}
}
public class B {
private A a_instance; // null
public void doSmthElse() {
a_instance.doSmth(); // NPE here without mock
// also do smth. else
}
}
現在,我有B b = new B();
並且我想測試b.doSmthElse()
,但是我之前需要為a_instance
對象創建一個模擬,否則我將得到NullPointerException
! 如何使用EasyMock或PowerMock實現此目標?
@Test
public void testDoSomething()
{
// setup: sut
B b = new B();
A mockA = EasyMock.createMock(A.class);
b.setA_instance(mockA); // If you have a setter
// setup: expectations
mockA.doSmth();
// exercise
EasyMock.replay(mockA);
b.doSmthElse();
// verify
EasyMock.verify(mockA);
}
@Test
public void testDoSomething_setUsingReflection()
{
// setup: sut
B b = new B();
A mockA = EasyMock.createMock(A.class);
// Set the collaborator using a Spring reflection utility
ReflectionTestUtils.setField(b, "a_instance", mockA);
// setup: expectations
mockA.doSmth();
// exercise
EasyMock.replay(mockA);
b.doSmthElse();
// verify
EasyMock.verify(mockA);
}
您可以使用
instanceName.methodName();
Easymock.expectLastCall(); //for void methods this is how it is done
instanceName可以是模擬的,也可以是actualInstance。
如果您可以將方法設為靜態,那么使用powermock會更容易
Powermock.mockStatic(ClassNameContainingStaticMethod)
所有靜態方法都直接被模擬
告誡:-將方法轉換為靜態方法在其他部分可能會有問題,請謹慎執行
希望能幫助到你。 祝一切順利!
我看不到為什么需要PowerMock的原因。 您可以使用EasyMock本身來實現。
@Test
public void testDoSmthElse() {
A a = EasyMock.createMock(A.class);
EasyMock.expect(a.doSmth()).andReturn(/*some value */);
EasyMock.replay(a);
B b = new B();
Object whatever = b.doSmthElse();
assert(); // psuedo-line. Add whatever assertion required
}
注意:導入適當的類
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.